Иерархическая структура данных WPF TreeListView - PullRequest
1 голос
/ 17 ноября 2009

Я сейчас пишу WPF TreeListView. Мне было интересно несколько вещей.

Как работает иерархическая структура данных и могут ли дочерние элементы отображать другие свойства вместо того же свойства, что и родительский? В настоящее время я пытаюсь сделать treelistview с колонками

Клиент / Дело / Часы

Если я добавлю клиента, и у него будет то же самое, то родитель изменит свои часы на общее количество часов на общее количество часов, добавленных детьми.

Вот пример

Я добавляю

Джон / Писчая бумага / 1 час
Джон / Писчая бумага / 2 часа
Джон / Писчая бумага / .5 часов

Мой список дерева покажет

Джон / Письменная бумага / 3,5 часа <это родитель <br> -Джон / Писчая бумага / 1 час
-Джон / Писчая бумага / 2 часа
-Джон / Писчая бумага / .5 часов <это дети <br>

Вместо этого я хотел бы показать

John / WRiting Paper / 3,5 часа
- 12:00 - 13:00 / написал введение
- 2:00 вечера - 4:00 вечера / написал тело
- 15:00 - 15:30 / написал заключение

Я использую две наблюдаемые коллекции. Тот, кто является родителем, и тот, который является ребенком.

Мой вопрос в основном такой. Могу ли я изменить иерархическую структуру данных для отображения разных свойств? Разная информация. Я не хочу повторяться, показывая одни и те же часы клиента. Вместо этого я хотел бы показать различные свойства для ребенка. Поскольку родитель будет показывать, кому принадлежит эта информация. Кстати, я пытаюсь сделать это для XAML и C #

Заранее спасибо !!
* 1039 Кевин *

Ответы [ 2 ]

1 голос
/ 17 ноября 2009

Если ваш родительский и дочерний объекты относятся к разным типам объектов, ответ очень прост: просто используйте несколько HierarchicalDataTemplates в ResourceDictionary:

<TreeView ItemsSource="{Binding Parents}">

  <TreeView.ResourceDictionary>

    <HierarchicalDataTemplate
        TargetType="{x:Type my:ParentType}"
        ItemsSource="{Binding Children}">

      ... parent content ...

    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate
        TargetType="{x:Type my:ChildType}"
        ItemsSource="{Binding Children}">

      ... child content ...

    </HierarchicalDataTemplate>

  </TreeView.ResourceDictionary>
</TreeView>

Эта техника работает не во всех сценариях, но когда она работает, она очень мощная и выразительная.

Другой вариант, если родительский и дочерний элементы одного типа, но с другим параметром, - это создание ItemTemplateSelector, который вызывает LoadResource() для загрузки соответствующего имени HierarchicalDataTemplate в зависимости от значений данных.

1 голос
/ 17 ноября 2009

Вы можете установить DataTrigger для HierarchicalDataTemplate и иметь другую привязку свойства. Просто пример ниже. Пожалуйста, проверьте этот более ранний ответ в этой теме на всякий случай, если вам нужно больше идей.

 <HierarchicalDataTemplate  DataType="{x:Type local:Person}" ItemsSource="{Binding People}" >
    <Grid>
      <TextBlock x:Name="fName" Text="{Binding FirstName}"/>
      <TextBlock x:Name="lName" Text="{Binding LastName}" Visibility="Collapsed"/>
   </Grid>
   <HierarchicalDataTemplate.Triggers> 
    <DataTrigger Binding="{Binding State}" Value="A">
      <Setter TargetName="fName" Property="Visibility" Value="Collapsed"/>
       <Setter TargetName="lName" Property="Visibility" Value="Visible"/>
    </DataTrigger>
  </HierarchicalDataTemplate.Triggers> 
</HierarchicalDataTemplate>  

Джоби Джой

...