我有MainWindow
,其中包含多个UserControls
。
目前,我有一个上帝ViewModel.cs
,它定义在MainWindow
级,并为所有UserControl工作。
现在我觉得这不是正确的做法。也许我应该为每个用户控件分别设置视图模型,对吧?但我的问题是如何在这些之间进行交互?假设某些事件发生在 usercontrol1 中,这会改变 usercontrol2 的viewmodel中的内容?
答案 0 :(得分:3)
对此没有确定的答案,这取决于具体情况。但是,针对不同情况提出了一些建议:
如果用户控件只是简单数据的精美显示,则可能不需要视图模型。可以通过依赖项属性公开所需的属性,并将其绑定到主视图模型。
如果用户控件很大(并且您使用它们更像页面),那么它们将大部分是独立的,因此交互不是问题。如果他们需要修改某些全局状态,那么他们可以这样做以更新其他视图模型
如果有 lot 的互动,那么您可能没有正确封装您的用户控件。一般情况下,我会尝试修复它,如果我不能,将共享数据放在主视图模型中,并将该对象传递给子视图模型,以便他们可以访问它。
您还需要注意用户控件视图模型,如果设置控件的DataContext
属性,则主控件对用户控件的绑定将无法按预期工作。一个简单的解决方法是将根UIElement
的{{1}}用于子视图模型。
答案 1 :(得分:2)
您应该使用事件来控制视图模型之间的交互。使用常规.NET事件的问题在于它将视图模型耦合在一起,因为它们对彼此具有明确的知识。
要解决此问题,您可以使用提供“事件代理”的现有MVVM框架,即视图模型可以订阅的机制,并在不必了解彼此的情况下发布事件。
MVVM框架的例子是PRISM,Caliburn Micro,MVVM Light等。
你也可以推出自己的活动经纪人,但除非你有充分的理由不这样做,否则可能更适合现有的活动经纪人。