WPF 树数据模板取决于项目类型

Pau*_*ten 3 c# wpf mvvm

我有一个 MVVM WPF 应用程序,其中有一棵包含自引用数据的树,该数据通过分层转换器绑定到该树。(例如: http: //www.telerik.com/help/wpf/radtreeview-how-to-bind-to-self-referencing-data.html

这些数据包括 ID、ParentID、文本和类型(等等)。

示例数据:

1,0,"FirstItem","Triangle"
2,1,"SubItem1","Circle"
3,1,"SubItem2","Square"
4,2,"SubItem11","Triangle"
5,2,"SubItem12","Heart"
6,3,"SubItem21","Circle"
Run Code Online (Sandbox Code Playgroud)

现在我想要三角形、心形、圆形和正方形的不同模板。我的意思不仅仅是更改图像,而是更改模板。我怎样才能做到这一点?

亲切的问候,保罗。

Bri*_*n S 7

如果您的ItemsSource类型由不同的类型组成,那么您可以简单地创建HierarchicalDataTemplates而不分配 x:Key。如果 a 没有 x:Key 属性DataTemplate,框架将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>
Run Code Online (Sandbox Code Playgroud)

然后,如果您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;
        }
}
Run Code Online (Sandbox Code Playgroud)

和 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>
Run Code Online (Sandbox Code Playgroud)

然后在您的 中TreeView,您只需分配选择器

<TreeView x:Name="Tree" ItemsSource="{Binding Shapes}" ItemTemplateSelector="{DynamicResource shapeSelector}"/>
Run Code Online (Sandbox Code Playgroud)