2010-08-16 31 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