在Windows 10(通用Windows平台)应用程序中的页面之间传递数据。 (C#/ MVVM)

时间:2016-04-12 12:08:38

标签: c# xaml mvvm win-universal-app windows-10-universal

观点:

  1. SinglePersonView.xaml(datacontext = SinglePersonViewModel.cs)注意:这也是主页面。
  2. HouseView.xaml(datacontext = HouseViewModel.cs)
  3. 的ViewModels:

    1. SinglePersonViewModel.cs
    2. HouseViewModel.cs
    3. 型号:

      1. Person.cs
      2. 在这个假设的情况下,我在SinglePersonViewModel.cs文件中实例化了一个Person对象。我对该对象执行一些操作。我点击按钮导航到HouseView.xaml。这里的目的是能够在HouseView.xaml中看到Person对象,并且还能够操纵其属性。目的是能够在所有视图中访问和修改此Person中的属性。

        规则:

        1. Person类不能是静态的。
        2. Person对象一旦创建,就需要从所有Views中访问。
        3. 问题/摘要:

          如何在页面之间传递数据?我应该在SinglePersonViewModel.cs以外的其他位置创建Person的实例吗?如果是的话,在哪里以及如何实施?

          提前致谢。

1 个答案:

答案 0 :(得分:1)

在MVVM模式中,您不仅有ViewViewModel部分。作为ViewModel的数据源,您应该创建Model类来控制您的人员持久性。

例如,您正在SinglePersonViewModel中创建或检索Person对象。首先,你应该调用model来拥有一个实例:

Person = personsModel.Get(personId);

然后你操纵人物属性并保存它:

personsModel.Save(Person);

现在您已打开HouseViewModel并希望拥有一个人员实例。只需调用模型来检索它:

Person = personsModel.Get(personId);

您还可以使用mvvmlight messenger(或其他EventAggregator*实现)来交换来自视图模型的消息。

Here is an example

SinglePersonViewModel发送

// Sends a notification message with a Person as content.
Messenger.Default.Send(new NotificationMessage<Person>(person, "Select"));

在[{1}}中接收:

HouseView
  

对于模块之间的低耦合通信(不仅仅是ViewModels)我们   可以尝试实现EventAggregator模式。事件聚合器   有助于在低耦合应用程序中实现订阅者/发布者模式。一世   知道几个不同的实现。

     

第一个基于CodeProject post并使用WeakReference   将帮助您防止内存泄漏。我不会发布整个代码   因为你可以只下载源代码并使用它。在这   实现你必须为你实现ISubscriber接口   订户。

     

第二个是Microsoft Prism实施。这是开放的   源项目然后您可以看到interfaceimplementation   和base event class。在此实现中,您必须取消订阅   从手动事件。

     

第三个也是最后一个是MVVMLight库及其Messenger   类。

     

正如您所看到的,所有这些实现都使用Singleton模式   节约用户。