WPF树的DataTemplate根据项目的类型(WPF Tree Datatemplate Dep

2019-07-21 08:30发布

我有一个自包含引用数据的树,这个数据绑定到树的层次转换器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"

现在,我想有三角形,心,圆形和正方形不同的模板。 我不意味只改变一个图片,但真正的模板。 我怎么能做到这样?

亲切的问候,保罗。

Answer 1:

如果你ItemsSource是由不同的类型,那么你可以简单地创建HierarchicalDataTemplates而不是分配X:关键。 如果没有X:一键属性DataTemplate ,该框架将使用此DataTemplate ,当它遇到的类型,并试图直观地显示它(你可以阅读更多关于隐含DataTemplates 这里 )。 例如,如果你有一个Circle类型和另一种类型的广场,你将有以下模板在你的资源:

<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)有区别的,你需要使用一个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}"/>


Answer 2:

如果你有实际的不同类型,你可以使用数据类型属性在HierarchicalDataTemplate指定类型( 如何使用一个WPF DataTemplate中?数据类型属性 )和WPF将选择基于类的模板。

如果没有不同的类型,但将取决于类中的属性或值,你需要指定一个DataTemplateSelector( http://tech.pro/tutorial/807/wpf-tutorial-how-to-使用-A-datatemplateselector )



文章来源: WPF Tree Datatemplate Depending on Type of Item
标签: c# wpf mvvm