Почему 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