在wpf中,我如何从其他ViewModel引用MainWindowViewModel



我正在为windows开发一个wpf/xaml应用程序。我想使用材料设计框架,我的应用程序松散地基于这里的示例应用程序代码:http://materialdesigninxaml.net/我的C#/xaml知识还可以,但非常生疏。

在这个实现中,有一个MainWindow.xaml视图链接到MainWindowViewModel,其中MainWindowViewModel处理来自模型和表示逻辑的数据转换。

我的问题是关于在MainWindow.xaml中查看的"页面"的最佳设计理念——我有一个可以在"页面"中导航的应用程序。因此,主窗口在ObservableCollection中存储了潜在页面,并显示了导航按钮。单击按钮可转到ObservableCollection中的下一页
我的问题是pageViewModel如何与MainWindowViewModel交互。例如,用户可能会单击pageView上的按钮,导致命令移动到另一个页面——要使用此框架执行此操作,需要在MainWindowViewModel上执行ICommand。

到目前为止,我所做的是让MainWindowViewModel创建其他页面ViewModel。在实例化pageViewModels时,保存对MainWindowViewModel的引用,该引用可以在MainWindowViewModels上进行编码,并可以在需要时执行。这似乎奏效了,但我也忍不住想会有一个更优化的解决方案。

我一直在SO上研究类似的问题——我需要研究IEventAggregator吗?

一种可能的解决方案是使用类似calburn-micro的UI框架。此框架将自动将视图与相应的ViewModel连接起来。还有一个所谓的指挥家。导体允许在主页面中使用多个具有自己的视图和视图模型的页面。它还提供激活和去激活行为以及更多功能。愿它有所帮助。

到目前为止,我所做的是让MainWindowViewModel创建其他页面ViewModel。在实例化pageViewModels时,保存对MainWindowViewModel的引用,该引用可以在MainWindowViewModels上进行编码,并可以在需要时执行。

这是一种方法。它的问题在于,它在视图模型类之间创建了紧密耦合。

一种更好且常见的方法是使用事件聚合器或信使在视图模型之间进行通信。这就消除了作为"用户"的紧密耦合;事件";或";消息";只观察事件聚合器而不是发布者,并且发布者只知道事件聚合器,而不知道订阅者。

有关这个概念的更多信息,请参阅这篇博客文章。

最新更新