在主視圖中我有一個顯示上下文數據 這取決於用戶正在做預覽部分(即,通過某些控制 相互作用,表現出一定的預覽部分)。視圖是否應包含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全部是關於功能的可重用性和封裝性。
你可以動態加載各種視圖模型? – Greg
我確定我可以_...但你能解釋它解決了什麼 - 我想念你的觀點。 –