我不明白wpf在这里做什么(使用带有C#的.NET 3.5):
在我的应用程序资源中,我为不同类型的ViewModel定义了几个DataTemplates和HierarchicalDataTemplates。到目前为止,这很好用,我的窗口中的TreeView显示了预期的节点。我不得不说每个ViewModel中的所有Childelements都是ICollectionView。 现在我决定使用ICollectionView的特性来分组,排序和过滤TreeView的“Rootnodes”。 我让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没有自动选择正确的模板以获得更深层次的元素。那有什么问题?
答案 0 :(得分:1)
您已明确定义 TreeView.ItemTemplate ,因此WPF将仅使用ItemTemplate
。您必须为类型定义 HierarchicalDataTemplate ,它对应于Groups
元素类型。
但定义组的直接方法是定义GroupStyle
属性。您可以在msdn
答案 1 :(得分:1)
经过一些研究后,最佳解决方案是定义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>
现在,Group节点能够扩展和折叠不同的子节点使用不同的DataTemplates。感谢@stukselbax指出我正确的方向。