wpf - WPF中的条件列表项目模板或数据模板

标签 wpf view

这可能是一个显而易见的问题,但我认为可能有多种实现方法,因此这不仅对我有用,而且希望对其他人有用。

本质上,我正在寻找实现列表 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/

相关文章:

Android 下滑动画

MySQL 使用 select * from tablename definition 查看性能

ObservableCollection 中的 C# 相等性

wpf - 模型更改时刷新 ViewModel 的所有属性的数据绑定(bind)的好方法

wpf - 织带 sample

wpf - 在 VB.net 代码隐藏中将 WPF RepeatBehavior 设置为 "none"

c# - 将图标放入 XAML 椭圆

php - 生成的 View 填充了 NULL

android - 安卓原生闹钟应用的时间选择器 View 在哪里可以找到?

java - 使 Canvas View 无效时单击按钮后应用程序崩溃(Android Studio,Java)