が異なるタイプで構成されている場合ItemsSource
は、単純HierarchicalDataTemplates
に x:Key を作成して割り当てなくてもかまいません。の 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
.
また
項目がすべて同じ Type で、プロパティ (Type など) によってのみ区別される場合は、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}"/>