2010-08-16 39 views
15

我正在寻找创建一个通用控件,我将能够在我的网页上重复使用:一个AddressControl,它具有Address1,Address2,City,State,Zip等......WPF最佳实践:自定义控件是否适用于MVVM设计?

本来我刚刚创建了一个类AddressEntity)包含所有这些项目,并实施INotifyPropertyChanged。我将该类作为DependencyProperty包含在AddressControl的Code-Behind中,并将其作为DataContext用于绑定到其属性。

然后,有人说我的代码很丑,我应该看看MVVM。看着它,我认为:

  • AddressEntity.cs将只是数据(即地址1,地址等)和成员(即克隆的ToString等)
  • 我需要一些的容器AddressViewModel包裹我的AddressEntity并提供PropertyNotification更改,验证等。
  • 我需要以某种方式为此“查看”。

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

  • 在这个例子中是否可以使用MVVM +自定义控件?
  • 它是几乎相同的事情(用户控件vs CustomControl)作为视图,除了UserControl与CustomControl的主要区别?基本上,我的CustomControl真的只是一个视图?

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

+0

下面的两个答案似乎是相互矛盾的。我现在很困惑...特别是因为第二个答案听起来更可能,但第一个答案(迄今为止3票)。 – 2010-08-16 22:07:48

+0

我同意NVM。我个人也觉得Custom Controls和MVVM不能很好地结合在一起。你在同一个项目中有CC和UC,但我不能想象为我的CC拥有一个虚拟机。 – akjoshi 2010-08-18 08:53:00

+1

@akjoshi我不明白为什么纯WPF和MVVM有什么关系。事实上,无论是自定义还是用户控制,您都不需要使用MVVM,我甚至会说在创建用户或自定义控件时不得使用MVVM。但是使用这些控件是的,MVVM是使用它们的好方法。我认为它很容易区分“现在我做商业逻辑和使用MVVM”和“现在我创建一个控制,并没有听说过mvvm”。例如,我们使用节点连接等构建了一个完整的图形控件,这些都是自定义控件,但使用此控件大多是通过视图模型完成的。 – dowhilefor 2012-04-17 14:39:41

回答

18

CustomControls从不与MVVM完成。

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

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

编辑:

尽管用户控件为什么最初开发,在MVVM通常,当你想要一个可重复使用的视图,专用于你的模型/视图模型使用用户控件。它只是没有任何代码的XAMl(除了自动生成的InitializeComponent东西)。通常,您将UserControl保留在您使用它的同一个项目中。

当您想要一个通用的功能时需要查看,这些功能甚至可能超出当前范围应用。这里的控件实际上是在代码文件中定义的,并且外观(可以被重写)通过XAML在资源字典中提供。 一般来说你保持在AA单独ControlLibrary项目CustomControl并引用库项目要在使用它。

充分尊重WallStreetProgrammer,用户控件和自定义控件之间进行选择完全基于与否你想要一个看不见的控制是有点幼稚。

+0

不幸的是,当涉及到用户与自定义控件时,还有一些额外的问题。例如,对ResourceDictionaries的处理,如果做错了,可能会使Usercontrols几乎无用。但我同意,用户或自定义控件的选择不应该由缺乏样式来完成。 – dowhilefor 2012-04-17 14:34:51

+0

如果资源字典没有正确处理,甚至可能导致整个应用程序无用:p。但是这与这个问题有什么关系呢? – NVM 2012-04-17 16:04:20

+0

当然你是对的,但在用户控件xaml中使用MergedDictionary要比在xaml上使用MergedDictionary的风格存储为自定义控件(或generic.xaml)要糟糕得多。我以艰难的方式了解到了这个问题。说实话,我根本没有看到使用用户控件的任何一点,但那只是我个人的观点。 – dowhilefor 2012-04-17 18:13:57

3

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

WPF中自定义控件和用户控件之间的区别在于,自定义控件是不见的,并且可以通过其ControlTemplate进行自定义。如果你正在编写一个通用控制库,就像你应该写的那样,这就是你应该写的。如果你有一个特定的外观让你控制,只需要用一个用户控件,它要快得多,但只能有一个外观,就是你为它定义的外观。

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

请参阅Control Authoring Overview