Как использовать wpf treeview с вложенными объектами разных типов - PullRequest
3 голосов
/ 01 августа 2009

У меня есть два класса, которые я хотел бы показать в виде дерева.

В моем главном окне у меня есть наблюдаемая коллекция объектов определенного типа, назовите это объектом a. Объект a содержит наблюдаемый набор объектов другого типа, объект b. Каждый объект b содержит наблюдаемую коллекцию объектов b.

Например, у меня может быть что-то похожее на это

ListOfObjectA в

-ObjectA1

- ListOfObjectB в

--- ObjectB

---- ListOfObjectB в

----- ObjectB

-ObjectA2

- ListOfObjectB в

--- ObjectB

Как должен выглядеть мой xaml, чтобы привязать дерево к чему-то подобному?

Извините, если я не объясняю это хорошо, я новичок в wpf.

Ответы [ 2 ]

6 голосов
/ 01 августа 2009

РБ имеет правильную идею.Именно здесь способность WPF применять шаблоны к обычным объектам .NET становится очень мощной.

Вам необходимо указать два HierarchicalDataTemplates, один для объектов типа a, а другой для объектов типа b.Примерно так:

<TreeView>
    <TreeView.Resources>
        <HierarchicalDataTemplate TargetType="{x:Type local:a}">
            <!-- XAML to display objects of type a -->
        </HierarchialDataTemplate>
        <HierarchicalDataTemplate TargetType="{x:Type local:b}">
            <!-- XAML to display objects of type b -->
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

Вам нужно будет указать привязки для свойства ItemsSource каждого шаблона, чтобы WPF знал, откуда взять дочерние объекты.Кроме того, вам нужно добавить объявление xmlns в корневой узел, определяющее пространство имен, в котором живут объекты (обозначается local в приведенном выше примере кода).

1 голос
/ 01 августа 2009

Я знаю достаточно WPF, чтобы быть действительно опасным, но я почти уверен, что HierarchicalDataTemplate является решением вашей проблемы. Мои навыки XAML сомнительны, поэтому я не могу написать хороший пример кода для вас. Вот как я использовал HierarchicalDataTemplate в своем проекте. Я надеюсь, что это дает вам хорошие идеи.

<TreeView Grid.Row="1" 
          Grid.Column="1" 
          ItemsSource="{Binding Children}" 
          SelectedItemChanged="TreeView_SelectedItemChanged" 
          ContextMenu="{StaticResource MenuContextMenu}">

  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate  ItemsSource="{Binding Children}" >
      <!--<TextBlock Text="{Binding Path=ItemName}" Margin="5,0,5,0" />-->
      <Grid  ContextMenu="{StaticResource ContextMenu}"   >
        <TextBlock  Name="ShownItem" 
                          Text="{Binding Path=ItemName}" 
                          Margin="0,0,0,0" />

          <TextBox Name="EditBox" 
                 Text="{Binding Path=ItemName}" 
                 Visibility="{Binding Path=Visibility}"
                 Style="{StaticResource EditableTextBox}" 
                 IsVisibleChanged="EditBox_IsVisibleChanged"
                 PreviewKeyDown="EditBox_KeyDown"
                 Margin="0,2,0,2"
                   >

              </TextBox>

      </Grid>
     </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>
</TreeView>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...