在 MVVM 模式中,視圖不應該知道任何關于模型的資訊,但是如果我想以不同的方式顯示不同的型別怎么辦?
例如我有兩個班級。Message 類和從 Message 繼承的 AttachmentMessage 類。
資訊
public class Message
{
public string Content { get; set; }
}
附件訊息
public class AttachmentMessage : Message
{
public string Filename { get; set; }
}
現在,當我在 . 中使用它們時ObservableCollection<Message>,我在這個集合中擁有兩個模型,但是我無法告訴 WPF 它必須使用哪個 Datatemplate,而不知道有哪些模型。
那么這個問題的解決方案是什么?
uj5u.com熱心網友回復:
最常見和推薦的方法是為您需要的每種型別創建一個資料模板,并將其放入您的資源中。以下代碼假定您的 observable 集合具有 name Messages。例子:
<ItemsControl ItemsSource="{Binding Messages}">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:Message}">
<TextBlock Text="{Binding Content}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:AttachmentMessage}">
<TextBlock Text="{Binding Filename}"/>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
另一種方法是創建一個DataTemplateSelector. 假設您的訊息都有一個指示其優先級的屬性。您可以創建如下所示的模板選擇器。DataTemplateSelector當您需要對選擇的模板進行更細粒度的控制時可以使用。
public class MyDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is Message m && container is FrameworkElement fm)
{
if (m.Priority == Priority.High)
{
return fm.FindResource("HighPriorityTemplate") as DataTemplate;
}
else
{
return fm.FindResource("NormalPriorityTemplate") as DataTemplate;
}
}
return null;
}
}
并在 xaml 中使用它,如下所示:
<Window.Resources>
<!-- Put your templates here-->
<local:MyDataTemplateSelector x:Key="MyDataTemplateSelector"/>
</Window.Resources>
<ItemsControl ItemsSource="{Binding Messages}" ItemTemplateSelector="{StaticResource MyDataTemplateSelector}">
正如我所指出的,在 MVVM 模式中,通常你有三個部分,Model,View和ViewModel。有些人采取直接系結到 的捷徑Model,但我通常會避免這種情況。您可以在此處找到有關此問題的討論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/344992.html
