为什么TreeView在定义TreeView.ItemTemplate后没有自动为Childnodes选择DataTemplates?

时间:2013-01-23 08:17:31

标签: wpf mvvm treeview datatemplate icollectionview

我不明白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没有自动选择正确的模板以获得更深层次的元素。那有什么问题?

2 个答案:

答案 0 :(得分:1)

您已明确定义 TreeView.ItemTemplate ,因此WPF将仅使用ItemTemplate。您必须为类型定义 HierarchicalDataTemplate ,它对应于Groups元素类型。

但定义组的直接方法是定义GroupStyle属性。您可以在msdn

上阅读有关ICollectionView功能的更多信息

答案 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指出我正确的方向。