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 ItemSource Связывание с номером * 1 *? –

+0

Нет, это не так. Поскольку я использую один и тот же узел «Число» для уровней внутренних узлов, Xsd2Code использует «Number» для внешнего уровня и «Number1» для всех внутренних уровней. – Ryan

ответ

1

Вероятно, вы уже решили эту проблему, но для меня, DataTemplates (HierarchicalDataTemplate также) никогда не работал должным образом, если бы я определил x: Key и Da taType одновременно. This question спрашивает о ТипДанных DataTemplates':

это свойство, которое очень похоже на TargetType свойство Style класса. Когда вы установите это свойство в тип данных без указания x: Key, DataTemplate автоматически применяется к объектам данных этого типа. Обратите внимание, что когда вы это делаете, x: Ключ установлен неявно. Поэтому, если вы присвоите этому DataTemplate значение x: Key, вы переопределяете неявный x: Ключ, а DataTemplate не будет применяться автоматически.

Я закончил создание одного DataTemplate с помощью x: Key и второго с DataType, который имел только один ContentControl, у которого ContentTemplate был установлен в DataTemplate с помощью x: Key.

Смежные вопросы