2

我有一个包含自引用数据的树的 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"

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

亲切的问候,保罗。

4

2 回答 2

5

如果您ItemsSource由不同的类型组成,那么您可以简单地创建HierarchicalDataTemplates而不分配 x:Key。如果 a 没有 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.

或者

如果您的项目都是相同的类型,并且仅通过属性(例如类型)进行区分,则您需要使用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}"/>
于 2013-03-11T16:51:54.600 回答
0

如果您有实际不同的类型,则可以使用 DataType 属性(如何在 WPF DataTemplate 上使用 DataType 属性?)在 HierarchicalDataTemplate 中指定类型,WPF 将根据类选择模板。

如果您没有不同的类型,但将取决于类中的属性或值,则需要指定 DataTemplateSelector ( http://tech.pro/tutorial/807/wpf-tutorial-how-to-使用数据模板选择器

于 2013-03-11T16:30:49.940 回答