0

我有一个自定义控件,它基本上是一种 TreeView。现在问题是我需要在我的 TreeView 控件中有任何级别的细节,所以我想出了以下数据模板

我有以下 Generic.xaml

<DataTemplate x:Key="treetemplate">
    <StackPanel>
     <TextBlock Text="{Binding Label}" ></TextBlock>
     <ItemsControl ItemsSource="{Binding Children}" ItemTemplate="{DynamicResource treetemplate}" />
    </StackPanel>
</DataTemplate>

<ControlTemplate TargetType="{x:Type local:CustomControl1}" x:Key="testkey">
    <ControlTemplate.Resources>
        <local:AnythingToListConverter x:Key="anyconv"></local:AnythingToListConverter>
    </ControlTemplate.Resources>
    <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
        <ItemsControl ItemsSource="{Binding Root, Converter={StaticResource anyconv}}" ItemTemplate="{StaticResource treetemplate}"  />
    </Border>
</ControlTemplate>

<Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Template" Value="{StaticResource testkey}" />
</Style>

这是我的自定义控件构造函数

        this.Root = new Node();

        this.Root.Label = "Root";
        this.Root.Children = new List<Node>();

        this.Root.Children.Add(new Node(){Label="Child1"});
        this.DataContext = this;

这就是控制的样子

控制

这是我认为的问题 对于同一模板的递归调用,我正在使用DynamicResource. 这从未对我有用,实际资源从未被调用过。如果我将其更改为StaticResource,它将无法编译,因为它不会看到自己。我如何解决它 ?

完整的解决方案可以在这里下载

4

1 回答 1

2

您需要的是HierarchicalDataTemplate。它旨在准确定位这种情况。以下是你如何使用它:

<HierarchicalDataTemplate ItemsSource="{Binding Children}" 
                          DataType="{x:Type local:Node}">
    <TextBlock Text="{Binding Label}" ></TextBlock>
</HierarchicalDataTemplate>

请注意,使用此模板,我们必须将其设置DataType为您的数据项的类型(在这种情况下,我猜它是Node)。另外我猜你不需要任何自定义控件,只需使用默认值TreeView,此模板定义为如下资源:

<TreeView ItemsSource="{Binding Root, Converter={StaticResource anyconv}}">
</TreeView>

如果您仍想保留您的代码,请尝试将您的代码替换ItemsControlTreeViewor some HeaderedItemsControlHierarchicalDataTemplate仅用于(也只是一种HeaderedItemsControl)。TreeViewHeaderedItemsControl

于 2014-10-30T07:39:18.047 回答