8

ツリービューで、類似したアイテムのコレクションをそれらが何であるかによってグループ化しようとしています。物事を一般的に保つために、私のオブジェクト階層は次のようになります。

  • オブジェクト
    • オブジェクトグループ#1
      • アイテム#1(タイプ「A」)
      • アイテム#2(タイプ「A」)
      • アイテム#3(タイプ'B')
      • アイテム#4(タイプ'B')

現在、私のTreeViewはこれらのオブジェクトをオブジェクトモデルとまったく同じように表示しますが、私がやりたいのは、オブジェクトタイプごとにTreeViewノードを挿入して次のようにすることです。

  • オブジェクト
    • オブジェクトグループ#1
      • タイプA
        • アイテム#1
        • アイテム#2
      • タイプB
        • アイテム#3
        • アイテム#4

ここで同様の質問で、誰かが2つを別々にすることを勧めたHierarchicalDataTemplatesので、タイプのリストを含むTreeViewを含む「オブジェクトグループ#1」レベル用に1つを作成しましたが、これは内部の完全に別々のTreeViewであるため、本当に不器用です。いくつかのノードの。また、各カテゴリのアイテムを除外するためにaを使用しようとしていCollectionViewSourceますが、表示方法がわからないため、あまりうまくいきません。

私の質問はこれに要約されると思います:どうすればHierarchicalDataTemplateそれが子供であるグループを作ることができますか?誰かが私を正しい方向に向けることができれば、私はそれを大いに感謝します。

誰かが見たい場合はコードを投稿できますが、私は本当に自分がやりたいことを実行する方法を理解しようとしているので、私のコードは今のところ非常に単純なデータバインドツリービューです。

4

4 に答える 4

7

スミさんのこの記事をご覧ください。私はそれがあなたを助けると確信しています。

記事の要点:

その問題に対する私の解決策には、次の要素が必要です。

  • 異なるバインディングを組み合わせることができるMultiBinding。
  • 必要に応じて、さまざまなバインドされたコレクションをサブフォルダーに整理するのに役立つコンバーター。
  • そしてもちろん:バインドされたデータの視覚的表現を提供するデータテンプレート。
于 2010-02-12T10:03:18.967 に答える
7

を使用してをバインドすることにより、この効果を実現できItemsSourceます。このコンバーターは単純に次のことを行います。HierarchicalDataTempalateIValueConverter

public class MyConverter : IValueConverter
{
  public object Convert(object value, ...)
  {
    return
      from item in (IEnumerable<MyItem>)value
      group item by item.Type into g
      select new { Type = g.Key, Items = g }
  }
  ...
}

HierarchcialDataTemplateこれで、次のようになります。

<HierarchicalDataTemplate ItemsSource="{Binding SomePath, Converter={x:Static local:MyConverter}">

  <HierarchicalDataTemplate.ItemTemplate>
    <HierarchicalDataTemplate
      ItemsSource="{Binding Items}"
      TargetType="{x:Type local:MyItem}"

      ItemTemplate="{StaticResource MyItemTemplate}">
         <!-- may omit ItemTemplate in prior line to use implicit template -->

      <TextBlock Text="{Binding Type}" /> <!-- Header for type -->

    </HierarchicalDataTemplate>
  </HierarchicalDataTemplate.ItemTemplate>

  <!-- header for "Object Group #1" -->

</HierarchicalDataTemplate>
于 2010-02-12T10:55:14.837 に答える
0

AFAIK、HierarchicalDataTemplateその子をグループ化することはできません。

ビューは、オブジェクトの種類/グループを実際に掘り下げることなく、取得したものをすべて表示する必要があります...オブジェクトモデルでこれらのグループを作成してみませんか?

そして、ビューは次のようになります。

public interface ITreeNode
{
    string Title;
    IList<ITreeNode> ChildNodes;  
}

を使用して表示しますHierarchicalDataTemplate

于 2010-02-11T23:01:41.933 に答える
0

これが表示目的のフラットコレクションからの単純なグループ化メソッドである場合は、「CollectionViewSource」を使用する方が適している可能性があります。プロパティ/コレクション変更イベントの伝播により、LINQの使用は悪夢になる可能性があります。

<CollectionViewSource x:Key="GroupedItems" Source="{Binding ItemsSource,  ElementName=My_UserControl}">
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Type" Converter="{StaticResource GroupingConverter}" />
    </CollectionViewSource.GroupDescriptions>
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="Date"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

<HierarchicalDataTemplate x:Key="GroupDataTemplate"  ItemsSource="{Binding Items}" >
    <TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>

<TreeView x:Name="ItemHolder" x:FieldModifier="private"
    ItemsSource="{Binding Source={StaticResource GroupedItems}, Path=Groups}"
... />
于 2015-06-16T00:09:09.643 に答える