C# 如何在WPF中为每个usercontrol创建单独的viewmodels
我有一个C# 如何在WPF中为每个usercontrol创建单独的viewmodels,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个main窗口,它由几个UserControls组成 目前,我有一个GodViewModel.cs,它是在MainWindow级别定义的,负责所有用户控件的工作 现在我觉得这不是正确的方法。也许我应该为每个用户控件设置单独的视图模型,对吗?但我的问题是如何在这两者之间相互作用?假设某个事件发生在usercontrol1中,它改变了usercontrol2的视图模型中的某些内容?您应该使用事件来控制视图模型之间的交互。使用常规.NET事件的问题在于,它会耦合viewmodels,因为它们彼此
main窗口
,它由几个UserControls
组成
目前,我有一个GodViewModel.cs
,它是在MainWindow
级别定义的,负责所有用户控件的工作
现在我觉得这不是正确的方法。也许我应该为每个用户控件设置单独的视图模型,对吗?但我的问题是如何在这两者之间相互作用?假设某个事件发生在usercontrol1中,它改变了usercontrol2的视图模型中的某些内容?您应该使用事件来控制视图模型之间的交互。使用常规.NET事件的问题在于,它会耦合viewmodels,因为它们彼此都有明确的知识 为了解决这个问题,您可以使用现有的MVVM框架,该框架提供了一个“事件代理”,也就是说,viewmodels可以通过该机制订阅和发布事件,而无需相互了解 MVVM框架的例子有PRISM、Caliburn Micro、MVVM Light等
您也可以使用自己的事件代理,但最好使用现有的事件代理,除非您有充分的理由不这样做。您应该使用事件来控制viewmodels之间的交互。使用常规.NET事件的问题在于,它会耦合viewmodels,因为它们彼此都有明确的知识 为了解决这个问题,您可以使用现有的MVVM框架,该框架提供了一个“事件代理”,也就是说,viewmodels可以通过该机制订阅和发布事件,而无需相互了解 MVVM框架的例子有PRISM、Caliburn Micro、MVVM Light等
您也可以使用自己的事件代理,但最好使用现有的事件代理,除非您有充分的理由不这样做。对此没有明确的答案,这取决于具体情况。但是,对于不同的情况,有一些建议:
您还需要小心使用用户控件视图模型,如果设置控件的
DataContext
属性,则主控件对用户控件的绑定将无法按预期工作。一个简单的解决方法是对子视图模型使用rootUIElement
的DataContext
。对此没有明确的答案,这取决于具体情况。但是,对于不同的情况,有一些建议:
您还需要小心使用用户控件视图模型,如果设置控件的
DataContext
属性,则主控件对用户控件的绑定将无法按预期工作。一个简单的解决方法是对子视图模型使用rootUIElement
的DataContext
。文本框是否有VM?ListView是否有VM?网格有虚拟机吗?那么为什么UserControl应该有一个VM呢?这是一种代码气味。闻起来像是你尝试这样做时会遇到的失败。只需在UserControl上创建公共属性,将它们绑定到VM,然后在UCs xaml中绑定到这些属性。或者在codebehind中执行您需要执行的任何UI逻辑。@Will Thank Will,您的意思是我应该以双向模式将public属性绑定到您的UserControl表面上的VM?public DependencyProperties。从内部约束他们,从外部约束他们。尽你所能把它们绑起来。走吧!捆绑@你能用一个简单的例子来说明这个问题吗?顺便说一下,我喜欢你的幽默感;)这个答案有一个例子,一个关于代码气味的较长解释,另一个希望是有帮助的。文本框有虚拟机吗?ListView是否有VM?网格有虚拟机吗?那么为什么UserControl应该有一个VM呢?这是一种代码气味。闻起来像是你尝试这样做时会遇到的失败。只需在UserControl上创建公共属性,将它们绑定到VM,然后在UCs xaml中绑定到这些属性。或者在codebehind中执行您需要执行的任何UI逻辑。@Will Thank Will,您的意思是我应该以双向模式将public属性绑定到您的UserControl表面上的VM?public DependencyProperties。从内部约束他们,从外部约束他们。尽你所能把它们绑起来。走吧!捆绑@你能用一个简单的例子来说明这个问题吗?顺便说一下,我喜欢你的幽默感;)这个答案是正确的