Page navigate 질문드립니다.

한 Window에 여러 Page가 있고, 이 Page들 각각은 여러 Page를 가지고 있을 때, 어떻게 Navigate를 하는게 좋을까요?
이전에는 한 윈도우가 여러 Page를 가진 형태여서 윈도우 비하인드에서 페이지를 생성하고 코드로 Navigate 할 수 있도록 했었는데, 이제는 그렇게 하면 모든 Page들을 마음대로 제어하기가 힘들어서요.
MVVM 패턴을 제가 잘 몰라서, 쓰지 않고서 Navigate를 잘 제어할 수 있을지도 궁금합니다.

3 Likes

이거한번 참고해보시겠어요?

정리를 잘해놓으신거같아서요~

3 Likes

WPF는 Page 기능을 필요에 따라 잘 쓰기도 잘 쓰지 않기도 하는 것 같습니다.

MVVM을 할 때는 보통 DataTemplate을 통해서 ViewModel과 UserControl 또는 CustomControl을 연결해서 사용하는 것이 꽤 널리 알려진 방식이기 때문인데요.

이렇게 했을 때 장점은 ContentPresenter에 ViewModel을 바인딩해주면 Presenter에서 알아서 지금 데이터인 ViewModel에 맞는 DataTemplate 리소스를 탐지하여 연결된 UserControl을 보여줍니다. WPF가 자체적으로 논리 트리를 타고 올라가는 전역 리소스 탐지 기능이 있기 때문입니다.

이것은 ViewModel만 관리하면 되기 때문에 View를 전혀 관리하지 않아서 MVVM 적으로 볼 때 관리가 편합니다. 그래서 이 방식이 많이 선호되는 것으로 알고 있습니다.

하지만, 이렇게 했을 때 문제점은 View 자체의 State가 유지되지 않는다는 점입니다.

위 방법은 ViewModel의 데이터를 의존하고 있기 때문에 View가 정말 Presenter를 통해 보여지기만 하는 그런 작업이기 때문에 Presenter에 ViewModel이 바뀌는 순간 해당 View가 가비지가 되며 이후 다시 그 ViewModel을 가져왔을 때는 ViewModel의 데이터 자체는 유지되지만 View의 Instance는 새로 만든 것이기 때문에 View의 어떤 State는 유지되지 않는 것입니다. (ViewModel의 데이터가 유지되는 것과는 다른 개념)

그래서 이런 ViewModel의 State가 유지되기를 바랄 때는 ViewModel의 Presenter 기반이 아닌 Frame과 Page를 조합하여 Navigation 하는 방식을 사용한다고 알고 있습니다.

사실 첫번째 방법은 네비게이션과 보여지는 것은 유사하지만 메커니즘이 다르므로 네비게이션이라고 부르기는 어렵긴 한 방법이라고 생각합니다.

2 Likes