观点:
的ViewModels:
型号:
在这个假设的情况下,我在SinglePersonViewModel.cs文件中实例化了一个Person对象。我对该对象执行一些操作。我点击按钮导航到HouseView.xaml。这里的目的是能够在HouseView.xaml中看到Person对象,并且还能够操纵其属性。目的是能够在所有视图中访问和修改此Person中的属性。
规则:
问题/摘要:
如何在页面之间传递数据?我应该在SinglePersonViewModel.cs以外的其他位置创建Person的实例吗?如果是的话,在哪里以及如何实施?
提前致谢。
答案 0 :(得分:1)
在MVVM模式中,您不仅有View
和ViewModel
部分。作为ViewModel
的数据源,您应该创建Model
类来控制您的人员持久性。
例如,您正在SinglePersonViewModel
中创建或检索Person对象。首先,你应该调用model来拥有一个实例:
Person = personsModel.Get(personId);
然后你操纵人物属性并保存它:
personsModel.Save(Person);
现在您已打开HouseViewModel
并希望拥有一个人员实例。只需调用模型来检索它:
Person = personsModel.Get(personId);
您还可以使用mvvmlight messenger(或其他EventAggregator*实现)来交换来自视图模型的消息。
从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实施。这是开放的 源项目然后您可以看到interface,implementation 和base event class。在此实现中,您必须取消订阅 从手动事件。
第三个也是最后一个是MVVMLight库及其Messenger 类。
正如您所看到的,所有这些实现都使用Singleton模式 节约用户。