WPF ViewModel 관리

현재 WPF의 MVVM을 사용하여 간단한(?) 플랫폼을 제작하고있습니다.

Splash Window로 구성된 LoginWindow에서 로그인하게되면 MainWindow로 진입합니다.
MainWindow는 열을 1:9정도로 나누어 SideMenu가 위치한 부분과 Navigation Frame으로 구성됩니다.

각 SideMenu를 누르면 다른 페이지로 이동하고 각 페이지는 서로 다른 ViewModel을 사용합니다.

private Menu1ViewModel Menu1ViewModel= new Menu1ViewModel();

private void Menu1_Click(object sender, RoutedEventArgs e)
{
    MainFrame.Navigate(new Menu1Page(Menu1ViewModel));
}

현재는 MainWindow의 코드 비하인드에서 ViewModel을 초기화하고 각 Page에 넣어주고 있습니다.
이러한 방식으로 개발했을 때 ViewModel을 초기화하기 어렵고 MVVM에 위반된다고 생각되어 수정이 필요할 것 같은데 방법을 잘 모르겠어서 질문 드립니다.

  1. ViewModel2를 사용하는 ViewModel1을 1Page에 Datacontext로 사용하고 싶을 때 MainWindow에서 ViewModel1을 1Page에 어떻게 넣어줘야하는지 궁금합니다.

  2. 현재 Page의 단계의 따라 SideMenu의 IsEnable을 변경해야하는데 SideViewModel을 만들어 MainWindow에서 사용해야하는지 궁금합니다.

  3. Navigate new Page를 사용하면 Page를 왔다갔다 할 때 ViewModel이 초기화되는 것 같은데 문제가 없는지 해결방법이 어떻게 있는지 궁금합니다.

긴 글 읽어주셔서 감사드리며 답변 부탁드리겠습니다 !

ViewModelLocator를 사용하시면 어떨까요? ViewModel들을 싱글턴으로 등록하고 View에서는 페이지 개념을 TabControl로 구현하는 방법을 종종 본 것 같습니다.

메뉴를 선택했을 때 표시되는 ViewModel을 MainWindow의 ViewModel 내부에 PageIndex(임의) 프로퍼티를 정의하고, TabControl의 SelectedIndex에 PageIndex를 바인딩 → 메뉴 버튼의 클릭 커맨드로 PageIndex를 변경

도움이 된다면 좋겠습니다. 저도 MVVM에 능숙하지 않아 틀린 부분이 있을 것 같네요… 다른 고수분들 조언도 기다려봅시다.

1 Like
// private Menu1ViewModel Menu1ViewModel= new Menu1ViewModel();

private static Menu1ViewModel SingletonVM = new Menu1ViewModel();

private Menu1ViewModel PageScopedVM = new Menu1ViewModel();

private Menu1ViewModel TransientVM => new Menu1ViewModel();

그리고, MVVM은 소프트웨어 구성 요소를 관심사에 따라 분리하라는 원칙이지, 객체의 생성 방법을 논하는 원칙이 아닙니다.

직접 생성하든, 서비스 컨테이너로부터 주입 받든, 부모 객체로부터 주입 받든 그것은 설계자의 재량입니다.

비록, 일반적으로 권고되는 것이 있기는 해도 말이죠.

1 Like

RadioButton에 해당 Command들 넣어서 해결했습니다. !! 감사합니다.

저는 Command연결하는 방식으로 해결했습니다 ㅎㅎ