【问题标题】:WPF MVVM navigation passing dataWPF MVVM 导航传递数据
【发布时间】:2016-05-12 09:36:08
【问题描述】:

如何使用 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;
}

假设我在 WeekdaysView 中,然后按一个工作日。现在我想导航到带有工作日的 GroceryView。Groceries 传递给 GroceriesVm。我将如何使用 MVVM 和 IoC 做到这一点?

请想象设置要复杂得多,大约有 20 个视图在各处导航。

【问题讨论】:

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


    【解决方案1】:

    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();
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2016-07-29
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多