2010-06-02 94 views
4

工作,我有以下問題與WPF用戶控件和MVVM

  1. 如果我的用戶的消費分配的用戶控件的DataContext的或設置一些依賴屬性。 (與#3有關:如果DataContext,那麼我的單個項目需要直接綁定到DC中給定的對象,如果DP那麼我有奢侈品綁定到任何VM)
  2. 如果他們設置屬性,並且如果我使用3原始項目,我應該接受它們作爲單獨的屬性,或將它們組合到一個模型爲我的用戶控制
  3. 我應該問我的用戶控件的消費者發送給我模型或視圖模型(我說viewmodel但我用過的所有控件到目前爲止,我從來沒有見過任何人要求我給他們VM - 我相信一些可以實現MVVM內部
+0

你的用戶控件做什麼?行爲是否依賴於虛擬機內的某些屬性?消費者通常可以自由設置/綁定他們認爲合適的任何屬性。大多數可以調整用戶控件行爲的東西都暴露爲屬性(DP)。 – Gishu 2010-06-02 11:51:27

+0

控制接收原始數據並對其進行消毒。 它還將拋光數據作爲在UI上可見的屬性進行公開。虛擬機包含將原始數據轉換爲拋光數據的邏輯。 – 2010-06-03 06:09:18

+1

聽起來不像UserControl行爲。聽起來更像是一個處理/翻譯/轉換器類,它接受一個數據結構並輸出另一個數據結構。然後你可以通過普通的WPF數據綁定將這個新的結構綁定到UI。 – Gishu 2010-06-04 05:49:47

回答

0

1. 我會說這取決於那種用戶控件的,如果是「GE neric「,你應該可以改變DataContext,因爲控件在內部不應該與DataContext有任何關係。例如,如果我創建了一個ImageButton用戶控件,它公開了屬性CaptionImageSource,那麼應該在內部獨立於DataContext綁定這些屬性,實例上可以綁定那些數據上下文,並且也可以更改DataContext。

<uc:ImageButton Caption="{Binding ButtonInfo.Caption}" 
       ImageSource="{Binding ButtonInfo.Image}"/> 

在這裏,人們可以再改變的DataContext簡化綁定了一下:

<uc:ImageButton DataContext="{Binding ButtonInfo}" 
       Caption="{Binding Caption}" 
       ImageSource="{Binding Image}"/> 

如果另一方面,用戶控件是一個視圖模型視圖我期望的用戶控件綁定到視圖模型內部相對於DataContext的屬性。

在一個DataTemplate在當前的DataContext已經是這一觀點沒有任何一個簡單的實例應該做的視圖模型

所以,即

<v:StatisticsView /> 

如果要通過視圖模型是在當前的DataContext的屬性,你可以綁定的DataContext還有:

<v:StatisticsView DataContext="{Binding StatisticsViewModel}"/> 

2. 這可以處理任何一種方式我要說的,特別是如果你哈只有三個屬性並沒有太多的麻煩來創建這些屬性。您可能需要考慮一些方面,如依賴性,例如將一個對象中的所有三個propeties分組是否合理?


3. 如圖1指出的,這應該是從該用戶控件本身顯而易見的,如果它是一個StatisticsView消費者應(通過繼承當前的DataContext或通過顯式綁定它或者隱含地)在StatisticsViewModel通過。

+0

它不像你在(1)中說的那樣工作,因爲如果內部我已經連接到1個datacontext,那麼當外部分配一個新的datacontext時,第一個(內部的)datacontext會中斷,因此功能會中斷。 爲什麼我需要這個?好吧,我想在內部視圖模型上編寫nunit測試,以便我知道控件的行爲是正確的。 – 2012-02-21 16:22:19

+0

@NitinChaudhari:正如我在(1)中指出的,只有* generic * UserControls不應該與DataContext有任何關係。另外爲什麼你需要在內部設置一個DataContext?您始終可以將其作爲DataContext繼承ViewModel,或者從外部明確設置它。 – 2012-02-21 16:27:50

+0

我需要內部設置它,因爲我在用戶界面上顯示的內容是由視圖模型處理的,它使得我可以保留1的eaiser,因爲我可以在其上編寫nunit測試。是的,我的控件將被用作多個地方的通用用戶控件。 – 2012-02-21 16:36:05

2

您的消費者想要一個用戶控件。所以我認爲用戶控件應該能夠在任何上下文/應用程序(WPF)中工作。所以,回答你的問題

1)消費者應該設置在用戶控件中定義的依賴屬性。通過使用datacontext,您將將usercontrol耦合到使用者。

2)把他們作爲個人基本屬性,否則消費者需要創建不必要的對象與您的模型,以滿足(耦合再次,爲什麼要消費者需要了解你的模型?)。

3)不,你不應該問cosumer送你你需要知道哪些消費者在使用「通用」用戶控制的觀點model.Why。

如果你不能做任何上述原因實際考慮的 - 那麼不要擔心違反任何/所有的規則,因爲你的用戶conrol被加上特定的上下文是不通用的了。如果您編寫通用用戶控件,則任何WPF應用程序都可以使用您的用戶控件。這是你的電話。