WPF MVVM导航传递数据

时间:2016-05-12 09:36:08

标签: wpf xaml mvvm navigation inversion-of-control

如何使用MVVM模式和IoC将复杂类型传递给构造函数?你将如何导航到新视图?

下面是一个简化的模型,显示了我想要做的事情。

class Weekday {
   List<Grocery> groceries;
}

class Grocery {
   string name;
}

class WeekdaysVm {
   List<Weekday> weekdays;

   public WeekdaysVm(IService service) { ... } 
}

class GroceriesVm {
   public GroceriesVm(IService service, List<Grocery> groceries) {
      ...
   }
   List<Grocery> groceries;
}

说我在工作日查看并按工作日。现在我想导航到具有工作日的GroceryView.Groceries传递给GroceriesVm。我将如何使用MVVM和IoC?

请想象这个设置要复杂得多,有大约20个视图可以在整个地方导航。

1 个答案:

答案 0 :(得分:3)

MVVM不包含导航的概念,所以你要问的是如何在不违反视图和视图模型中的MVVM原则的情况下在视图之间导航。

在我看来,你应该创建一个名为INavigationFactory的类(例如),它可以注入到每个ViewModel中。然后在界面上,您可以为要创建的不同导航公开操作

Action GetPage1NavigationAction();
Action GetPage2NavigationAction();
Action GetPage3NavigationAction();

其中一种方法的实施示例可能是:

public Action GetPage2NavigationAction()
{
   var action = () => 
   {
      var vm = new Page2ViewModel();
      var view = new Page2Page();
      view.DataCntext = vm;
      Navigate(view); // or whatever method you'd call to navigate
   }
   return action;
}

然后在你的Page1 ViewModel(例如)中,在你的Button click命令中你可以拥有:

Avtion nextPageNav = navigationFactory.GetPage2NavigationAction();
nextPageNav();

您可以在工厂操作中包含参数以在页面之间传递数据。