Почему TreeView не выбирает автоматически DataTemplates для дочерних узлов после определения TreeView.ItemTemplate?

Я не понимаю, что здесь делает wpf (используя.NET 3.5 с C#):

в моих прикладных ресурсах я определил несколько DataTemplates и HierarchicalDataTemplates для разных типов ViewModels. Пока это работает хорошо, и TreeView в моем окне показывает узлы, как ожидалось. Я должен сказать, что все Childelements в каждой ViewModel пришли как ICollectionView. Теперь я решил использовать особенности ICollectionView, чтобы сгруппировать, отсортировать и отфильтровать "корневые узлы" TreeView. Я сделал TreeView выглядеть следующим образом:

<TreeView ItemsSource="{Binding Path=Elements.Groups}">
  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Path=Items}" ItemTemplate="{StaticResource SOMEITEMTEMPLATENAME}">
      <TextBlock Text="{Binding Path=Name}"/>
    </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>
</TreeView>

ViewModel выглядит так:

class RootViewModel
  : INotifyPropertyChanged
{

  public ICollectionView Elements
  {
     get
     {
       ICollectionView view = CollectionViewSource.GetDefaultView(_elementsFromModel.Select(x => new FirstChildViewModel(x));
       view.GroupDescriptions.Add(new PropertyGroupDescription("Name"));
       view.Filter = delegate(Object x) { /*do some filter stuff here*/ };

       return view;
     }
  }
}

class FirstchildViewModel
  : INotifyPropertyChanged
{
  /*some other stuff here*/

  public ICollectionView Items
  {
    get;
  }
}

Проблема сейчас в том, что TreeView не выбирает автоматически правильные шаблоны для более глубоких элементов. Так что не так с этим?

2 ответа

Решение

Лучшее решение после некоторых исследований было бы определить TreeView следующим образом:

<TreeView ItemsSource="{Binding Path=Elements}">
  <TreeView.GroupStyle>
    <GroupStyle>
      <GroupStyle.ContainerStyle>
        <Style TargetType="{x:Type GroupItem}">
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="{x:Type GroupItem}">
                <TreeViewItem>
                  <TreeViewItem.Header>
                    <TextBlock Text="{Binding Path=Name}"/>
                  </TreeViewItem.Header>

                  <ItemsPresenter Margin="-20,0,0,0"/>
                </TreeViewItem>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
      </GroupStyle.ContainerStyle>
    </GroupStyle>
  </TreeView.GroupStyle>
</TreeView>

теперь узлы группы могут расширяться и сворачиваться, а разные дочерние узлы используют разные шаблоны данных. Спасибо @stukselbax за указание правильного направления.

Вы явно определили TreeView.ItemTemplate, поэтому WPF будет использовать только это ItemTemplate, Вы должны определить свой HierarchicalDataTemplate для типа, который соответствует Groups тип элемента.

Но простой способ определить группу состоит в том, чтобы определить GroupStyle имущество. Вы можете прочитать больше о возможностях ICollectionView на MSDN

Другие вопросы по тегам