質問

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になります(プロパティの制限のため)。このプロパティは、現在の選択が変更されると子アイテムのリストを変更し、子アイテムはそれらを表示するリストボックスにバインドされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top