如果您ItemsSource
由不同的类型组成,那么您可以简单地创建HierarchicalDataTemplates
而不分配 x:Key。如果 a 没有 x:Key 属性DataTemplate
,框架将DataTemplate
在遇到该类型时使用它并尝试以可视方式显示它(您可以DataTemplates
在此处阅读有关隐式的更多信息)。例如,如果您有一个类型 Circle 和另一个类型 Square,您的资源中将有以下模板:
<Window.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Circle}" ItemsSource="{Binding Children}">
<Ellipse Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Square}" ItemsSource="{Binding Children}">
<Rectangle Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
</HierarchicalDataTemplate>
</Window.Resources>
然后,如果您TreeView
在其中遇到这些类型之一ItemsSource
,它将使用该HierarchicalDataTemplate
特定类型。
HierarchicalDataTemplates
您可以在此处阅读更多信息,并且此链接有一个示例,说明它们如何在TreeView
.
或者
如果您的项目都是相同的类型,并且仅通过属性(例如类型)进行区分,则您需要使用DataTemplateSelector
. 这是一个简单的例子:
代码隐藏:
public class ShapeTemplateSelector : DataTemplateSelector
{
public DataTemplate CircleTemplate { get; set; }
public DataTemplate SquareTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Shape shape = item as Shape;
if (shape != null)
{
if (shape.Type == "Circle")
return this.CircleTemplate;
else if (shape.Type == "Square")
return this.SquareTemplate;
}
return null;
}
}
和 XAML:
<local:ShapeTemplateSelector x:Key="shapeSelector">
<local:ShapeTemplateSelector.CircleTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Shape}" ItemsSource="{Binding Children}">
<Ellipse Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
</HierarchicalDataTemplate>
</local:ShapeTemplateSelector.CircleTemplate>
<local:ShapeTemplateSelector.SquareTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Shape}" ItemsSource="{Binding Children}">
<Rectangle Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
</HierarchicalDataTemplate>
</local:ShapeTemplateSelector.SquareTemplate>
</local:ShapeTemplateSelector>
然后在您的 中TreeView
,您只需分配选择器
<TreeView x:Name="Tree" ItemsSource="{Binding Shapes}" ItemTemplateSelector="{DynamicResource shapeSelector}"/>