如果您的
ItemsSource
由不同的类型组成,则可以简单地创建
HierarchicalDataTemplates
并不分配x:Key。 如果没有
DataTemplate
的x:Key属性,框架将在遇到该类型并尝试可视化显示它时使用此
DataTemplate
(您可以在
这里了解有关隐式
DataTemplates
更多信息)。 例如,如果您有一个圆形类型和另一个正方形类型,则会在资源中拥有以下模板:
<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}"/>
DataTemplateSelector
: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/2bd054fe-2fb6-47ed-be8f-26545c07e655/ - Richard Deeming