2013-07-05 20 views
0

這個問題是關於如何將MVVM考慮在內的應用程序設計。我理解MVVM的一般概念(ViewModel不知道視圖,模型表示域對象等)。我也知道命令以及一些控件如何在ViewModel上調用命令。如何使用MVVM最佳實踐來設計視圖

我無法弄清楚的是如何分析一個真實的應用程序以適應這個模型(而不是簡單的文本框/按鈕/查詢數據庫示例)。下面是一些問題:

  • 在主視圖中,我有預覽部分,根據用戶正在做什麼(即通過與某些控件交互,顯示一些預覽部分)顯示上下文數據。該視圖是否應包含XAML中所有可能的預覽,然後顯示/隱藏/更新? ViewModel應該具有像ViewModel的內部狀態機設置的「public bool ShowPreviewA」和「public bool ShowPreviewB」屬性嗎?
  • 當某些控件之間存在錯綜複雜的相互作用時,邏輯何處存在。例如,通過防止取消選中,必須至少選擇一個的3個複選框。在我看來,它一方面會污染ViewModel,另一方面也覺得對View有某些「知識」。

這個問題很難正確表達(如果可以的話,我可能會更好地理解MVVM)。

歡迎任何提示。

編輯: 真正的問題是如何在編寫ViewModels的功能時打破這個問題。它是自頂向下的組合 - 即對ViewModel屬性中的每個可能的View狀態進行編碼 - 以及自下而上 - 即每個邏輯相關的控件組從子ViewModel接收它們的屬性,報告「up」某個邏輯狀態(例如有效輸入) ?

+0

你可以動態加載各種視圖模型? – Greg

+0

我確定我可以_...但你能解釋它解決了什麼 - 我想念你的觀點。 –

回答

1

在主視圖中我有一個顯示上下文數據 這取決於用戶正在做預覽部分(即,通過某些控制 相互作用,表現出一定的預覽部分)。視圖是否應包含XAML中所有可能的預覽,然後顯示/隱藏/更新? ViewModel 應該具有像ViewModel的內部狀態機設置的「public bool ShowPreviewA」和「public bool ShowPreviewB」屬性嗎?

不,當然不是,如果這些「預覽」是完全不同的數據完全不同的UI,然後使用DataTemplates

例如:

鑑於一些類:

public class Person: BusinessEntity //BusinessEntity is just a fictional base class for Model classes 
{ 
    public string LastName {get;set;} 
} 

public class Product: BusinessEntity 
{ 
    public string ProductName {get;set; 
} 

假設您的視圖模型的定義是這樣的:

public class SomeViewModel: ViewModelBase //Same comment as above 
{ 
    public BusinessEntity SelectedEntity {get;set;} //NotifyPropertyChanged() etc 
} 

你的XAML可以這樣定義:

<Window ...> 
    <Window.Resources> 

     <!-- DataTemplate for Person class --> 
     <DataTemplate DataType="Person"> 
      <TextBox Text="{Binding LastName}"/> 
     </DataTemplate> 

     <!-- DataTemplate for Product class --> 
     <DataTemplate DataType="Product"> 
      <TextBox Text="{Binding ProductName}"/> 
     </DataTemplate> 
    </Window.Resources> 

    <ContentPresenter Content="{Binding SelectedEntity}"/> 

</Window> 

WPF將負責在ContentPresenter內呈現合適的DataTemplate,具體取決於將ViewModel中的SelectedEntity屬性放入哪個對象類型。


應該在哪裏邏輯住的時候一些控件,它們之間複雜的相互作用 。例如,通過防止取消選中3個複選框,其中至少必須選擇 。在我看來, 一方面會污染視圖模型,另一方面也覺得有關於視圖的某些「知識」是 。

您可以輕鬆繼承ObservableCollection<T>以可重複使用的方式創建此邏輯。然後在你的ViewModel中只需放一些public SelectableCollection<T> MyItems {get;set;}選擇/互斥等由SelectableCollection等處理。底線:MVVM全部是關於功能的可重用性和封裝性。

+0

我不確定我完全理解。我可以創建條件(如以編程方式分配,或根據綁定對象的類型)DataTemplate? –

+0

這個SelectableCollection - 就像嵌套的ViewModel一樣嗎? –

+0

啊...我想我有SelectableCollection的想法。 –