【问题标题】:How to have separate viewmodels for each usercontrol in WPF如何为 WPF 中的每个用户控件设置单独的视图模型
【发布时间】:2014-12-03 03:49:05
【问题描述】:

我有一个MainWindow,它由几个UserControls 组成。

目前,我有一位上帝ViewModel.cs,它定义在MainWindow 级别,负责所有用户控件的工作。

现在我觉得这不是正确的做法。也许我应该为每个用户控件设置单独的视图模型,对吧?但我的问题是如何在这些之间进行交互?假设 usercontrol1 中发生了一些事件,它改变了 usercontrol2 的视图模型中的某些内容?

【问题讨论】:

  • 文本框有虚拟机吗? ListView 有虚拟机吗?网格有虚拟机吗? 那么为什么 UserControl 应该有一个 VM? 这是一种代码味道。当你尝试这样做时,你会遇到失败。只需在您的 UserControl 上创建公共属性,将它们绑定到您的虚拟机,然后在您的 UCs xaml 中绑定到这些属性。或者在代码隐藏中执行您需要执行的任何 UI 逻辑。
  • @Will 谢谢Will,你的意思是我应该以双向模式将公共属性绑定到VM?
  • 用户控件表面上的公共 DependencyProperties。从内部绑定到他们,从外部绑定到他们。尽可能地绑定它们。前进!并绑定!
  • @Will 你能用一个非常简单的例子告诉我吗?顺便说一句,我喜欢你的幽默感;)

标签: c# wpf mvvm


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢布拉德利,实际上我目前已将主窗口的 DataContext 设置为其所有子用户控件,并且工作正常。其中一个用户控件很大但不是独立的,我想我将不得不坚持这种架构,直到我扩展我对 MVVM 的了解。
【解决方案2】:

您应该使用事件来控制视图模型之间的交互。使用常规 .NET 事件的问题在于它会耦合视图模型,因为它们会明确了解彼此。

要解决这个问题,您可以使用现有的 MVVM 框架,该框架提供“事件代理”,即视图模型可以订阅和发布事件而无需了解彼此的机制。

MVVM 框架的示例有 PRISM、Caliburn Micro、MVVM Light 等。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多