WPF树形数据模板根据项的类型而异

3

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

这些数据包括ID、ParentID、Text和Type(以及更多内容)。

示例数据:

1,0,"FirstItem","Triangle"
2,1,"SubItem1","Circle"
3,1,"SubItem2","Square"
4,2,"SubItem11","Triangle"
5,2,"SubItem12","Heart"
6,3,"SubItem21","Circle"

现在我想为三角形、心形、圆形和正方形使用不同的模板。

我不仅是指更换图像,而是真正的模板。

我该如何实现这样的功能?

谢谢,保罗。


听起来你需要一个DataTemplateSelector: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/2bd054fe-2fb6-47ed-be8f-26545c07e655/ - Richard Deeming
2个回答

7
如果您的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>

如果你的TreeViewItemsSource中遇到这些类型之一,它将使用该特定类型的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}"/>

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接