あなたの質問は、 (Data) Bindingである WPF の非常に基本的な概念に関連しています。この記事から始めてください。
興味深い/編集可能なオブジェクトを のTag
プロパティに配置TreeViewItem
することは、UI 設計にとって非常に悪い考えであることに注意してください。プロパティはコードから簡単にアクセスできますTag
が、UI からバインドするのは非常に困難/複雑になります。TreeView
SelectedItem/SelectedIndex
TreeViewItems
この例で遊んでください:
<StackPanel Orientation="Horizontal">
<TreeView x:Name="twi">
<TreeViewItem Tag="one" Header="111">
<TextBlock Text="First" />
</TreeViewItem>
<TreeViewItem Tag="two" Header="222">
<TextBlock Text="Second" />
</TreeViewItem>
<TreeViewItem Tag="three" Header="333">
<TextBlock Text="Third" />
</TreeViewItem>
</TreeView>
<StackPanel Orientation="Vertical">
<TextBlock Text="The text:" />
<TextBlock Text="{Binding ElementName=twi, Path=SelectedItem}" />
<TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag}" />
<TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag.Name}" />
<TextBlock Text="{Binding ElementName=twi, Path=SelectedItem.Tag.Surname}" />
</StackPanel>
</StackPanel>
これはサンプル全体です。どこにでも置いてください。左側にアイテム、右側にいくつかのラベルがあります。TreeView をクリックすると、ラベルが更新され、選択されているものとそのTag
プロパティが表示されます。もちろん、TAG は単純な文字列に設定されているため、.Name と .Surname には何も表示されません。ただし、一部のデータ オブジェクトに TAG を設定すると、正しく表示されます。TWI をクリックすると期待どおりの結果が得られることに注意してください。ただし、TWI の子をクリックすると、そうはなりません。つまり、子テキストが選択されているのです。
ツリービューに何を配置するか、およびタグの値を何/どこに配置するかについて非常に注意する必要があります。これは良い方法ではありません。より一般的には、次のようにします。
public class Person
{
// properties
public string Name { .... }
public string Surname { ... }
public List<Person> Subordinates { .... }
}
<StackPanel Orientation="Horizontal">
<TreeView x:Name="twi">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Subordinates}">
<TextBlock>
<Run Text="{Binding Name}" />
<Run Text=" " />
<Run Text="{Binding Surname}" />
</TextBlock>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
<StackPanel Orientation="Vertical">
<TextBlock Text="The selected person:" />
<TextBox Text="{Binding ElementName=twi, Path=SelectedItem.Name, Mode=TwoWay}" />
<TextBox Text="{Binding ElementName=twi, Path=SelectedItem.Surname, Mode=TwoWay}" />
</StackPanel>
</StackPanel>
そしてもちろん、いくつかのサンプル データを作成し、それをその ItemsSource として treeView に提供します。このように、TreeView はアイテムを自動的に作成し、テンプレートを適用し、クリックするたびに、SelectedItem はTreeViewItem
s ではなく、Person
直接編集可能な を提供します。したがって、ウィンドウの右側では、単純な へのバインドSelectedItem.Name
が「そのまま機能」し、2 方向にすると、Person が直接更新されます。
免責事項: 私はコードを実行していません。バグやタイプミスがあるかもしれません。コードは、一般的なアイデアを示すためのものです。