Каков наилучший способ обработки навигации в приложении WPF по шаблону MVVM? - PullRequest
4 голосов
/ 28 февраля 2010

Я видел, как это было сделано внутри обработчика событий непосредственно за файлом .xaml, однако не похоже, чтобы это следовало шаблону MVVM: MainApplication.mainFrame.Navigate(new HomePage()); Есть ли лучший способ обработки навигации с помощью шаблона MVVM, возможно, во ViewModel? или в XAML?

Ответы [ 2 ]

8 голосов
/ 28 февраля 2010

Если вы хотите показать разные UserControls в зависимости от контекста ваших данных, просто поймите следующую простую концепцию DataBinding и DataTemplate и углубитесь в нее. Представьте, что вы получили свойство с именем CurrentViewModel, которое связывается с содержимым ContentControl внутри вашего окна

 <Window ... 
    <ContentControl Content="{Binding CurrentViewModel}" />
 </Window>

Теперь представьте, что у вас есть классы ViewModel ClassA и ClassB, поэтому соответствующим образом установите экземпляры в CurrentViewModel и определите глобальные DataTemplates (Views) для ваших классов

<DataTemplate DataType="{x:Type vm:ClassA}">
    <local:UserControlForA../>
</DataTemplate>


<DataTemplate DataType="{x:Type vm:ClassB}">
    <local:UserControlForB../>
</DataTemplate>

Теперь представление автоматически управляется из логики ViewModel, и WPF позаботится о том, чтобы отображать UserControl от Datatemplate.

Если вы не знакомы с MVVM, лучше воспользуйтесь этой статьей. http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

2 голосов
/ 01 марта 2010

Я думаю, что вы пытаетесь сделать проще, если бы у вас была навигация в другом классе. Смотри ниже

public class FirstViewModel
{

}

public class SecondViewModel
{

}

public class NavigateViewModel
{
  public ViewModelBase CurrentVieModel {get;set;}

  public bool CanNavigate
  {
     get { return true;//Or Add some custom logic here determine if you can navigate}
  }
  public void Navigate()
  {
     //Just some arbitrary code
     if(CurrentViewModel is FirstViewModel)
       CurrentViewModel = new SecondViewModel();
  }

}

Теперь просто 1) привязать содержимое страницы к CurrentViewModel 2) Оберните метод навигации в ICommand, и вы настроены

Может не соответствовать вашим потребностям, надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...