WPF TreeView HierarchicalDataTemplate无限节点

时间:2010-06-04 14:18:33

标签: wpf data-binding treeview hierarchicaldatatemplate xsd2code

当xml使用相同的类名来拥有无限级别时,我在将树视图填充到第一级以外时遇到问题。我使用Xsd2Code来创建对象类。

为了保持这篇文章长达3000行,我提供了一个下载项目的链接。可以下载here

我的XML示例

<Testing>
  <Numbers>
    <Number val="1">
      <Number val="1.1">
        <Number val="1.1.1">
          <Number val="1.1.2" />
          <Number val="1.1.3" />
          <Number val="1.1.4" />
        </Number>   
      </Number>
      <Number val="1.2" />
      <Number val="1.3" />
      <Number val="1.4" />
    </Number>
    <Number val="2" />
    <Number val="3" />
    <Number val="4" />
  </Numbers>
  <Numbers>
    <Number val="5" />
    <Number val="6" />
    <Number val="7" />
    <Number val="8" />
  </Numbers>
</Testing>

XAML

<Window.Resources>
    <local:TestingXmlData x:Key="TestXML" />
</Window.Resources>

<Grid>
    <Grid.Resources>

        <HierarchicalDataTemplate x:Key="MainData" ItemsSource="{Binding Number1}"
                                  >
            <Border>
                <Label VerticalContentAlignment="Center">
                    <TextBlock Text="{Binding val}" VerticalAlignment="Center" TextWrapping="Wrap"></TextBlock>
                </Label>
            </Border>
        </HierarchicalDataTemplate>


        <HierarchicalDataTemplate x:Key="Test" ItemsSource="{Binding Number}"
                                  ItemTemplate="{StaticResource MainData}"
                                  DataType="{x:Type local:Number}"
                                  >
            <Border>
                <Label VerticalContentAlignment="Center">
                    <TextBlock Text="{Binding val}" VerticalAlignment="Center" TextWrapping="Wrap"></TextBlock>
                </Label>
            </Border>
        </HierarchicalDataTemplate>

    </Grid.Resources>

    <telerik:RadTreeView ItemsSource="{Binding Source={StaticResource TestXML}, Path=TestingDataSource}"
                         ItemTemplate="{StaticResource Test}"  
                         />
</Grid>

背后的代码

public class TestingXmlData
{
    private Testing testing;

    public TestingXmlData()
    {
        this.TestingDataSource = new ObservableCollection<Number>();

        var t = AppDomain.CurrentDomain.BaseDirectory;
        testing = Testing.LoadFromFile(t + @"../../Test.xml");

        var numberBranch = (from tt in testing.Items
                   select tt.Number).ToList();

        foreach (var num in numberBranch)
            foreach (var entry in num)
                this.TestingDataSource.Add(entry);
    }

    public ObservableCollection<Number> TestingDataSource
    {
        get;
        set;
    }
}

1 个答案:

答案 0 :(得分:1)

可能你已经解决了这个问题,但对我来说,如果我同时定义了x:Key和DataType,那么DataTemplates(HierarchicalDataTemplate)也从未正常工作。 This question询问DataTemplates的DataType:

  

此属性与TargetType类的Style属性非常相似。如果将此属性设置为数据类型而未指定 x:Key ,则DataTemplate会自动应用于该类型的数据对象。请注意,当您这样做时,隐式设置 x:Key 。因此,如果您为此DataTemplate分配 x:Key 值,则会覆盖隐式 x:Key ,并且不会应用DataTemplate自动。

我最终创建了一个带有x:Key的DataTemplate和带有DataType的第二个DataTemplate,它只有一个ContentControl,其中ContentTemplate设置为带有x:Key的DataTemplate。