2010-06-04 161 views
2

當xml使用相同的類名稱具有無限級別時,我在填充第一級別以上的樹形視圖時出現問題。我用Xsd2Code來創建對象類。WPF TreeView HierarchicalDataTemplate無限節點

爲了保持這篇文章的長度不超過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; 
    } 
} 
+0

它是您的MainData Itemssource綁定到數字* 1 *的拼寫錯誤嗎? – 2010-06-04 21:38:53

+0

不,不是。由於我在內部節點級別使用同一個節點「Number」,因此Xsd2Code在外層使用「Number」,在所有內層使用「Number1」。 – Ryan 2010-06-07 17:45:48

回答

1

也許你已經解決了這一點,但對我來說,的DataTemplates(HierarchicalDataTemplate )如果我定義了x:Key和數據類型在同一時間。 This question詢問的DataTemplates'數據類型:

這個屬性是非常相似的Style類的TargetType財產。當您將此屬性設置爲數據類型而未指定x:鍵時,DataTemplate會自動應用於該類型的數據對象。請注意,當您這樣做時,隱式設置x:Key。因此,如果您將此DataTemplate一個x:鍵值賦值,則您將覆蓋隱含的x:將不會自動應用鍵DataTemplate

我最終創建了一個帶有x:Key的DataTemplate,第二個帶有DataType,它只有一個ContentControl將ContentTemplate設置爲帶有x:Key的DataTemplate。