c# - 如何使用 DataTemplates 支持 ListBox 的继承

标签 c# wpf

我有一个ListBox,它的数据源是一些对象的可观察数组。这些对象都派生自一个基类。

我试图给数组的每个实例一个特定的数据模板来处理它与其他实例的差异。

abstract class Base
{
    public string a {get; set;};
}
class sub1 : Base
{
    public string prop1 {get; set;};
}
class sub2 : Base
{
    public string prop2 {get; set;};
}

如果数组包含两个实例,一个是 sub1,另一个是 sub2,列表框应该为第一个显示两个属性 a 和 prop1,然后为第二个实例显示 a 和 prop2。

请指教,

最佳答案

您可以创建一个 DataTemplateSelector :

public class MyTemplateSelector : DataTemplateSelector
{
    public DataTemplate Sub1Template { get; set; }
    public DataTemplate Sub2Template { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is sub1) { return Sub1Template; }
        if (item is sub2) { return Sub2Template; }

        return null;
    }
}

然后按如下方式使用:

<UserControl>
    <UserControl.Resources>
        <DataTemplate x:Key="TemplateForSub1">
            <StackPanel>
                <TextBlock Text="{Binding a}" />
                <TextBlock Text="{Binding prop1}" />
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="TemplateForSub2">
            <StackPanel>
                <TextBlock Text="{Binding a}" />
                <TextBlock Text="{Binding prop2}" />
            </StackPanel>
        </DataTemplate>
        <my:MyTemplateSelector x:Key="MySelector"
                               Sub1Template="{StaticResource TemplateForSub1}"
                               Sub2Template="{StaticResource TemplateForSub2}" />
    </UserControl.Resources>
    <ListBox ItemsSource="{Binding SomeCollectionSomewhere}"
             ItemTemplateSelector="{StaticResource MySelector}" />
</UserControl>

这应该让你开始。

更新:您当然可以使用 <DataTemplate DataType="{x:Type ...}" ...>严格根据项目类型选择数据模板。在许多情况下这样做可能更简单。 DataTemplateSelector可以提供一些灵 active DataType=不能,例如根据类中的值或方法调用的结果更改模板等。选择适合您的一个。

关于c# - 如何使用 DataTemplates 支持 ListBox 的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29514835/

相关文章:

c# - 在每行开头之前添加空格(字符串的第一行除外)?

c# - C#:程序正在做一些后台处理时的 “not responding”窗口

C# WPF - 等待页面加载

c# - EF调用存储过程出现 "must declare the scalar variable @var"错误如何解决?

c# - STA 线程在 Winforms 中使用,但在作为控制台应用程序执行时不使用

c# - 允许对实体使用自定义属性的最佳设计

c# - 有没有更有效的方法来获取 C# 中给定日期的前一个星期一

c# - 更新 wpf 中的 UI 元素

wpf - DataTemplateSelector 不会被使用

WPF 和初始焦点