wpf 윈도우 창 로드 되어있는지 여부를 확인하는 좋은방법?

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위배 입니다. :rofl:

6 Likes

누겟을 설치하지 않고 처리할 수 있는 방법을 찾고 있는데 좋은 방법이없을까요…?

누겟 설치 없이 해당 dll만 참조하셔도 됩니다.

dll 참조도 싫으시다면 위 기능과 동일하게 직접 비헤이비어를 만들어서 처리할 수 도 있습니다.
(비헤이비어 직접 구현도 딱히 어렵지 않아요)

5 Likes

감사합니다!

ILoadedAware 같은 인터페이스를 만들고, 뷰모델에서 해당 인터페이스를 구현해서 의존도를 낮추는 법도 있습니다.

interface ILoadedAware
{
    void OnLoaded();
}

classMytViewModel : ILoadAware
{
    public void OnLoaded() { ... }
}

this.Loaded += (s, e) =>
{
    if (DataContext is ILoadedAware loadedHandler)
    {
        loadedHandler.OnLoaded();
    }
};

Loaded 는 View의 이벤트이므로 비하인드에서 작성한다고 해도 괜찮을 것 같습니다.

7 Likes

저도 @레스티 님이 설명해주신 방식처럼 즐겨 사용하고 있습니다.

leagueoflegends-wpf/src/Jamesnet.Core/IViewLoadable.cs at main · JamesnetGroup/leagueoflegends-wpf

leagueoflegends-wpf/src/Jamesnet.Windows/WPFView.cs at main · JamesnetGroup/leagueoflegends-wpf

leagueoflegends-wpf/src/Leagueoflegends.Main/Local/ViewModels/MainContentViewModel.cs at main · JamesnetGroup/leagueoflegends-wpf

2 Likes

다들 감사합니다.