这可能是一个显而易见的问题,但我认为可能有多种实现方法,因此这不仅对我有用,而且希望对其他人有用。
本质上,我正在寻找实现列表 View 的最佳方法,该列表 View 可以接受不同类型的对象,然后使用该对象的适当项目/数据模板来呈现它们。
例如,我们有一个标准的产品列表 View ,当我们查看不同的类别时,企业决定要为每个不同的类别显示不同的商品模板样式。
在这里提出此问题的主要原因是,避免使用讨厌的hacky解决方案,而是找到一种好的清理方法。
希望我提供了足够的信息,如果您需要更多信息,请告诉我。
最佳答案
只需在DataTemplates
中使用相应的 Resources
指定DataType
就足够了,例如
<ListView ItemsSource="{Binding Data}">
<ListView.Resources>
<!-- Do NOT set the x:Key -->
<DataTemplate DataType="{x:Type local:Employee}">
<TextBlock Text="{Binding Name}" Foreground="Blue"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Machine}">
<TextBlock Text="{Binding Model}" Foreground="Red"/>
</DataTemplate>
</ListView.Resources>
</ListView>
(请注意
DataTemplate.DataType
也可以用于隐式XML数据模板(请参阅docs),因此属性类型是而不是 System.Type
,因此与Style.TargetType
不同,您必须使用 x:Type
引用CLR类型。如果您输入字符串,它将不会转换为类型。)您可能还需要研究
CompositeCollections
,以获得各种类型的干净合并列表。我使用的样本数据:
ObservableCollection<Employee> data = new ObservableCollection<Employee>(new Employee[]
{
new Employee("Hans", "Programmer") ,
new Employee("Elister", "Programmer") ,
new Employee("Steve", "GUI Designer") ,
new Employee("Stephen", "GUI Designer") ,
new Employee("Joe", "Coffee Getter") ,
new Employee("Julien", "Programmer") ,
new Employee("John", "Coffee Getter") ,
});
ObservableCollection<Machine> data2 = new ObservableCollection<Machine>(new Machine[]
{
new Machine("XI2", String.Empty),
new Machine("MK2-xx", String.Empty),
new Machine("A2-B16", String.Empty),
});
CompositeCollection cc1 = new CompositeCollection();
cc1.Add(new CollectionContainer() { Collection = data });
cc1.Add(new CollectionContainer() { Collection = data2 });
Data = cc1;
关于wpf - WPF中的条件列表项目模板或数据模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5644392/