我有一个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/