繁体   English   中英

如何在WPF中为每个用户控件拥有单独的视图模型

[英]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等。

您也可以推出自己的事件代理,但最好与现有的事件代理一起使用,除非您有充分的理由不这样做。

对此没有确切的答案,这取决于具体情况。 但是,针对不同情况的一些建议:

  1. 如果用户控件只是简单数据的精美显示,则它们可能不需要视图模型。 可以通过依赖项属性公开所需的属性,并将其绑定到主视图模型。

  2. 如果用户控件很大(并且您使用它们的方式更像页面),那么它们将大多是独立的,因此无需担心交互。 如果他们需要修改某些全局状态,则可以这样做以更新其他视图模型

  3. 如果存在大量交互,则可能是您没有正确封装用户控件。 通常,我会尝试解决此问题,如果无法解决,请将共享数据放入主视图模型中,然后将该对象传递给子视图模型,以便他们可以访问它。

您还需要注意用户控件视图模型,如果您设置控件的DataContext属性,则主控件上用户控件上的绑定将无法按预期工作。 一个简单的解决方法是将根UIElementDataContext用于子视图模型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM