1

我不明白 wpf 在这里做了什么(使用 .NET 3.5 和 C#):

在我的应用程序资源中,我为不同类型的 ViewModel 定义了几个 DataTemplates 和 HierarchicalDataTemplates。到目前为止,这运作良好,我的窗口中的 TreeView 显示了预期的节点。我不得不说每个 ViewModel 中的所有 Childelements 都是以 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 没有为更深的子元素自动选择正确的模板。那么这有什么问题呢?

4

2 回答 2

1

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

但是定义组的直接方法是定义GroupStyle属性。您可以在msdn上阅读有关 ICollectionView 功能的更多信息

于 2013-01-23T08:43:55.353 回答
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>

现在组节点能够展开和折叠不同的子节点使用不同的数据模板。感谢@stukselbax 为我指明了正确的方向。

于 2013-01-23T10:45:01.187 回答