Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中为每个usercontrol创建单独的viewmodels_C#_Wpf_Mvvm - Fatal编程技术网

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
组成

目前,我有一个God
ViewModel.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
    属性,则主控件对用户控件的绑定将无法按预期工作。一个简单的解决方法是对子视图模型使用root
    UIElement
    DataContext

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

  • 如果用户控件只是简单数据的奇特显示,那么它们可能不需要视图模型。所需的属性可以通过依赖项属性公开,并绑定到主视图模型

  • 如果用户控件很大(您使用的控件更像是页面),那么它们基本上是独立的,因此不需要考虑交互。如果需要修改某些全局状态,则可以这样做以更新其他视图模型

  • 如果存在大量交互,那么您可能没有正确封装用户控件。一般来说,我会尝试解决这个问题,如果不能解决,则将共享数据放在主视图模型中,并将该对象传递给子视图模型,以便它们可以访问它


  • 您还需要小心使用用户控件视图模型,如果设置控件的
    DataContext
    属性,则主控件对用户控件的绑定将无法按预期工作。一个简单的解决方法是对子视图模型使用root
    UIElement
    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。从内部约束他们,从外部约束他们。尽你所能把它们绑起来。走吧!捆绑@你能用一个简单的例子来说明这个问题吗?顺便说一下,我喜欢你的幽默感;)这个答案是正确的