1

ここでwpfが何をするのかわかりません(C#で.NET 3.5を使用):

私のアプリケーション リソースでは、さまざまなタイプの 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>

ビューモデルは次のようになります。

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>

グループ ノードは、異なる子ノードが異なる DataTemplate を使用して展開および折りたたみできるようになりました。正しい方向に向けてくれた@stukselbaxに感謝します。

于 2013-01-23T10:45:01.187 に答える