如何使用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个视图。
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(例如)中,在按钮点击命令中,您可以只拥有:
Avtion nextPageNav = navigationFactory.GetPage2NavigationAction();
nextPageNav();
您可以在工厂操作中包含参数,以便在页面之间传递数据。