【问题标题】:WPF Best Practices: Do custom controls work well with the MVVM design?WPF 最佳实践:自定义控件是否适用于 MVVM 设计?
【发布时间】:2023-03-05 00:41:02
【问题描述】:

我正在考虑创建一个可以在我的页面上重复使用的通用控件:一个包含 Address1、Address2、City、State、Zip 等的 AddressControl...

最初我只是创建了一个包含所有这些项目的类 (AddressEntity) 并实现了INotifyPropertyChanged。我将该类作为 DependencyProperty 包含在 AddressControl 的代码隐藏中,并将其用作 DataContext 以绑定到其属性。

然后,有人说我的代码很丑,我应该研究一下 MVVM。看着它,我假设:

  • AddressEntity.cs 将只是数据(即 Address1、Address2 等)和成员(即 Clone、ToString 等)的容器
  • 我需要一些 AddressViewModel 来包装我的 AddressEntity 并提供 PropertyNotification 更改、验证等。
  • 我需要以某种方式对此有一个“视图”。

问题是我见过的每个示例都有一个 UserControl 作为 View 而不是 CustomControl。在我深入研究之前......

  • 是否可以在本示例中使用 MVVM + 自定义控件?
  • 除了 UserControl 与 CustomControl 的主要区别外,它与 View 是否几乎相同(UserControl 与 CustomControl)?基本上,我的 CustomControl 真的只是一个 View 吗?

参考:The Model-View-ViewModel (MVVM) Design Pattern for WPF

【问题讨论】:

  • 下面的两个答案似乎相互矛盾。我现在很困惑......特别是因为第二个答案听起来更有可能,但第一个答案有(到目前为止 3 票)。
  • 我同意 NVM。我个人也觉得Custom Controls和MVVM不能很好的结合在一起。你在同一个项目中确实有 CC 和 UC,但我想不出我的 CC 有一个 VM,而有 UC 的 VM 是有道理的。
  • @akjoshi 我不明白为什么纯 WPF 和 MVVM 彼此有任何关系。事实上,无论是自定义控件还是用户控件,您都不需要使用 MVVM,我什至会说您在创建用户或自定义控件时一定不能使用 MVVM。但是使用这些控件是的,MVVM 是使用它们的好方法。我认为很容易区分“现在我制作业务逻辑并使用 MVVM”和“现在我创建了一个控件但从未听说过 mvvm”。例如,我们构建了一个完整的图形控件,节点连接等都是自定义控件,但使用这个控件主要是通过视图模型完成的。
  • @dowhilefor 是的,总是在那里,没有必要使用 MVVM。您自己提供了为什么 MVVM 不适合 CC 的提示 - “商业逻辑”;一般来说,CC 没有任何业务逻辑,只有控件的实现和模板,CC 应该可用于多个应用程序(如您的图表控件)。客户端应用程序使用 MVVM with CC 绝对有意义,但不适用于 创建 CC。
  • @akjoshi 好的,比我们在同一页上,我只是想念你了。

标签: c# wpf mvvm custom-controls


【解决方案1】:

自定义控件永远不会用 mvvm 完成。

您想要的是数据的可重用视图(用户控件),而不是控件(自定义控件)。

UserControls 和 CustomControls 是两个完全不同的野兽。

编辑:

尽管最初开发 UserControls 的原因,在 MVVM 中,当您想要特定于您的模型/视图模型的可重用视图时,通常会使用 UserControl。它只是 XAMl,后面没有任何代码(除了自动生成的 InitializeComponent 东西)。通常,您将 UserControl 保存在您使用它的同一个项目中。

如果您想要一个通用功能,需要一个视图,即使在您当前的应用程序范围之外也有潜在用途,您可以选择 CustomControl。此处控件实际上是在代码文件中定义的,并且外观(可以被覆盖)来自资源字典中的 XAML。 通常,您将 CustomControl 保存在一个单独的 ControlLibrary 项目中,并在您希望在其中使用它的项目中引用该库。

充分尊重 WallStreetProgrammer,仅根据您是否想要一个无外观的控件在用户控件和自定义控件之间进行选择有点幼稚。

【讨论】:

  • 不幸的是,当涉及到用户控件与自定义控件时,还有一些额外的问题。例如,对 ResourceDictionaries 的处理,如果做错了,可能会使 Usercontrols 变得毫无用处。但我同意,用户或自定义控件的选择不应该因为缺乏样式而单独完成。
  • 如果资源字典没有被正确处理,你甚至可以使整个应用程序变得无用:p。但这与问题有什么关系?
  • 当然你是对的,但是在用户控件 xaml 中使用 MergedDictionary 比在为自定义控件(或 generic.xaml)存储样式的 xaml 上使用 MergedDictionary 更糟糕.我很难学到这个教训。老实说,我根本看不出使用用户控件有什么意义,但这只是我个人的意见。
  • “通常你在一个单独的 ControlLibrary 项目中保留一个 CustomControl,并在你希望在其中使用它的项目中引用该库”...这个陈述不是很准确,因为如果你尝试创建一个 WpfControlLibrary在 Blend 中,它会默认创建一个 UserControl。
  • 那么...使用带有 UserControl 的 MVVM 很好,而不是带有自定义控件?
【解决方案2】:

在使用 MVVM 时,Model 和 ViewModel 不应该依赖于 View,也就是说它们不应该关心使用哪种视图。

WPF中自定义控件和用户控件的区别在于自定义控件是无外观的,可以通过其ControlTemplate进行自定义。如果您正在编写通用控件库,就像 Microsoft 所做的那样,这就是您应该编写的内容。但是,如果您对控件有特定的外观,只需使用用户控件,它会更快,但只会有一个外观,即您为其定义的外观。

在 MVVM 项目中混合使用自定义控件和用户控件是很常见的。例如,您可能会使用来自 Microsoft 的一堆自定义控件(如文本框和文本块)并将它们组合到用户控件中。

Control Authoring Overview

【讨论】:

    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多