我对WPF MVVM比较陌生。我目前正在开展一个小项目,以了解有关WPF MVVM概念的详细信息,我正面临一个小问题,我无法理解。
我有一个带有<ContentControl Content="{Binding Path=CurrentViewModel}" />
的主窗口,在主窗口ViewModel类上设置了CurrentViewModel属性。主窗口有三个按钮控件,用于列出,编辑和删除实体。 ContentControl加载UserControl(ListEntities),列出来自某个数据存储的所有实体。 UserControl xaml有自己的ViewModel类,它被设置为ContentControl内容属性,并使用DataTemplates加载视图。
这一切都很好。我的要求是,当用户在ListEntities UserControl GridView中选择一行时,必须启用编辑和删除按钮(使用ICommand基础结构的CanExecute方法)。问题是我可以基于SelectedItem属性绑定在UserControl ViewModel类上设置SelectedEntity属性,但是如何让所选项目可用于主窗口视图模型类,以便启用编辑/删除按钮(如何从父视图中我将知道使用MVVM模式选择了子视图中的项目。因此,以更通用的方式,我试图理解最基本的窗口中的独立ViewModel和基于父视图或子视图中的某个事件的子用户控件之间的通信的最标准过程。
答案 0 :(得分:0)
我喜欢在ViewModel之间进行通信的方法是Publish and Subscribe
。大多数MVVM-Frameworks提供类似EventAggregator
或Messenger
模式是您将Messenger
通过DI
传递到ViewModel
(有时也会以分离的方式对视图有用),并且您可以在一侧发送通知另一方你订阅。发布 - 订阅。
还可以实现诸如传递paylod,键入消息和回调之类的好消息,以通知发送者。 你应该进一步调查这个主题。
因为它始终以Parent Child开头,很快就会变得很有趣。打开用于加载文件等的对话框......所以对于我的观点来说,PubSub将是最佳去耦方式。但过分小心处理也会让人感到困惑......
<强>棱镜强>
事件聚合器https://msdn.microsoft.com/en-us/library/ff921122(v=pandp.20).aspx
MVVM Light
http://dotnetpattern.com/mvvm-light-messenger (http://www.mvvmlight.net/help/WP8/html/9fb9c53a-943a-11d7-9517-c550440c3664.htm)。
反应式用户界面
https://reactiveui.net/docs/handbook/message-bus/
Caliburn Micro EventAggregator https://caliburnmicro.com/documentation/event-aggregator
希望这会有所帮助(链接只是随机排序而不按优先顺序排列,因此取决于你=)......)