WPF複数のマスター/詳細、同じグリッド
-
05-07-2019 - |
質問
3つのレベルがある TreeView
があります。
リーグ、ディビジョン、チームを TreeView
としましょう。
今、ツリー内の各アイテムを選択すると、それに関する詳細情報が表示されます。
これを達成する最良の方法は何ですか?
Grid
はアイテム( ListBox
など)を持たないため、単に ItemsSource
を設定してを作成することはできませんDataTemplate
...
選択したアイテムのみを含む ListBox
を使用することを考えましたが、これは非常に悪いようです...
ありがとう。
解決
まず、リーグ、ディビジョン、およびチームクラスの3つの DataTemplate
を定義します。その後、 TreeView
をオブジェクトのルートにバインドします。リーグおよびディビジョンのクラスには、子を返すChildrenプロパティが必要です。すべてのクラスにはNameプロパティが必要です。
単一のオブジェクトを表示する場合は、 ContentPresenter
を使用し、 TreeView
の場合はそのコンテンツを SelectedItem
にバインドします。
例:
<StackPanel>
<StackPanel.Resources>
<DataTemplate DataType="{x:Type your_namespace:League}">
<StackPanel Orientation="Vertical">
<TextBlock Text={Binding Name}/>
<.../>
<StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type your_namespace:Division}">
<StackPanel Orientation="Vertical">
<TextBlock Text={Binding Name}/>
<.../>
<StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type your_namespace:Team}">
<StackPanel Orientation="Vertical">
<TextBlock Text={Binding Name}/>
<.../>
<StackPanel>
</DataTemplate>
</StackPanel.Resources>
<TreeView x:Name="_tree" ItemsSource="{Binding RootOfYourItems}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text={Binding Name}/>
</HierarchicalDataTemplate>
</TreeView>
<ContentPresenter Content="{Binding Path=SelectedItem, ElementName=_tree}" />
</StackPanel>
このコードはテストもコンパイルもされておらず、例として提供されています。
他のヒント
ツリー構造のプロパティ、現在の選択、および現在の選択の詳細を含むビューモデルを作成します。
ツリー構造体はツリービューに一方向にバインドされ、ツリービューのSelectedItemは現在の選択プロパティにバインドされたOneWayToSourceになります(プロパティの制限のため)。このプロパティは、現在の選択が変更されると子アイテムのリストを変更し、子アイテムはそれらを表示するリストボックスにバインドされます。