mvvm 패턴을 준수한다고 했을 때 가장 좋은 방법이 무엇일까요?
this.Loaded += (s, e) =>
{
if (DataContext is MytViewModel vm)
{
vm.WindowLoadedCommand.Execute(null);
}
};
아무래도 비하인드 코드에서 처리하는게 찝찝해서요…
mvvm 패턴을 준수한다고 했을 때 가장 좋은 방법이 무엇일까요?
this.Loaded += (s, e) =>
{
if (DataContext is MytViewModel vm)
{
vm.WindowLoadedCommand.Execute(null);
}
};
아무래도 비하인드 코드에서 처리하는게 찝찝해서요…
가장 간단한 방법으로
System.Windows.Interactivity 를 사용한 비헤이비어 처리 방식이 있습니다.
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
참고로 Loaded 이벤트 메서드 시그니처에 해당되는 파라메터 모두 ViewModel로 넘겨주면 MVVM위배 입니다.
누겟을 설치하지 않고 처리할 수 있는 방법을 찾고 있는데 좋은 방법이없을까요…?
누겟 설치 없이 해당 dll만 참조하셔도 됩니다.
dll 참조도 싫으시다면 위 기능과 동일하게 직접 비헤이비어를 만들어서 처리할 수 도 있습니다.
(비헤이비어 직접 구현도 딱히 어렵지 않아요)
감사합니다!
ILoadedAware 같은 인터페이스를 만들고, 뷰모델에서 해당 인터페이스를 구현해서 의존도를 낮추는 법도 있습니다.
interface ILoadedAware
{
void OnLoaded();
}
classMytViewModel : ILoadAware
{
public void OnLoaded() { ... }
}
this.Loaded += (s, e) =>
{
if (DataContext is ILoadedAware loadedHandler)
{
loadedHandler.OnLoaded();
}
};
Loaded 는 View의 이벤트이므로 비하인드에서 작성한다고 해도 괜찮을 것 같습니다.
저도 @레스티 님이 설명해주신 방식처럼 즐겨 사용하고 있습니다.
leagueoflegends-wpf/src/Jamesnet.Core/IViewLoadable.cs at main · JamesnetGroup/leagueoflegends-wpf
leagueoflegends-wpf/src/Jamesnet.Windows/WPFView.cs at main · JamesnetGroup/leagueoflegends-wpf
다들 감사합니다.