![](/img/trans.png)
[英]How to add UserControl to Canvas of MainView from multiple ViewModels in WPF MVVM
[英]How to have separate viewmodels for each usercontrol in WPF
我有一个MainWindow
,其中包含几个UserControls
。
目前,我有一个God ViewModel.cs
,它在MainWindow
级别定义,并且为所有UserControls做功。
现在我觉得这不是正确的方法。 也许我应该为每个用户控件都有单独的视图模型,对吗? 但是我的问题是这些之间如何交互? 假设有一个事件发生在usercontrol1中 ,这改变了usercontrol2的viewmodel?
您应该使用事件来控制视图模型之间的交互。 使用常规.NET事件的问题在于,它会耦合视图模型,因为它们会相互之间具有明确的知识。
为了解决这个问题,您可以使用现有的提供“事件代理”的MVVM框架,即一种视图模型可以通过其订阅和发布事件的机制,而无需彼此了解。
MVVM框架的示例是PRISM,Caliburn Micro,MVVM Light等。
您也可以推出自己的事件代理,但最好与现有的事件代理一起使用,除非您有充分的理由不这样做。
对此没有确切的答案,这取决于具体情况。 但是,针对不同情况的一些建议:
如果用户控件只是简单数据的精美显示,则它们可能不需要视图模型。 可以通过依赖项属性公开所需的属性,并将其绑定到主视图模型。
如果用户控件很大(并且您使用它们的方式更像页面),那么它们将大多是独立的,因此无需担心交互。 如果他们需要修改某些全局状态,则可以这样做以更新其他视图模型
如果存在大量交互,则可能是您没有正确封装用户控件。 通常,我会尝试解决此问题,如果无法解决,请将共享数据放入主视图模型中,然后将该对象传递给子视图模型,以便他们可以访问它。
您还需要注意用户控件视图模型,如果您设置控件的DataContext
属性,则主控件上用户控件上的绑定将无法按预期工作。 一个简单的解决方法是将根UIElement
的DataContext
用于子视图模型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.