コンテンツコントロールのコンテンツがTreeViewまたはListBoxのSelectedValueに設定されるようにバインドする必要があります。最後に変更されたSelectedValueは、ContentControlのコンテンツを提供する必要があります。WPF- TreeViewとListBoxのSelectedValuesにバインドする方法はありますか?
0
A
答えて
1
私は以下の概念を使用してこれを実現できました。
- コンテンツコントロールを読み取り専用プロパティ "SelectedItem"(プライベートプロパティ_selectedItem)にバインドします。
- ListBox.SelectedItemを読み取り/書き込みプロパティ "SelectedItemLB"にバインドします。
- SelectedItemLBセッターで_selectedItemの値を設定し、SelectedItemのPropertyChangedイベントを発生させます。
- _selectedItemの値を設定し、SelectedItemのPropertyChangedイベントを発生させるVreeView.SelectedItemChangedのハンドラを作成します。ここで
私の完全なコードです:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
this.items = new List<object>();
this.items.Add(new Car("Green"));
this.items.Add(new Car("Blue"));
this.items.Add(new Car("Red"));
this._selectedItem = this.items[0];
this.treeView1.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(treeView1_SelectedItemChanged);
this.DataContext = this;
}
void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
this._selectedItem = treeView1.SelectedItem;
PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem"));
}
private List<object> items;
public List<object> Items
{
get { return items; }
set { items = value; }
}
public object SelectedItemLB
{
get { return _selectedItem; }
set
{
_selectedItem = value;
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem"));
}
}
}
private object _selectedItem;
public object SelectedItem
{
get { return _selectedItem; }
}
public event PropertyChangedEventHandler PropertyChanged;
}
XAMLは非常に単純です:
<StackPanel>
<ListBox Name="listBox1" ItemsSource="{Binding Path=Items}" SelectedItem="{Binding Path=SelectedItemLB, Mode=TwoWay}" ></ListBox>
<TreeView Name="treeView1" ItemsSource="{Binding Path=Items}">
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected}"></Setter>
</Style>
</TreeView.Resources>
</TreeView>
<ContentControl Content="{Binding Path=SelectedItem.Color}"></ContentControl>
</StackPanel>
1
私はそれを直接行う方法を考えることはできません。しかし、いくつかの簡単な解決策があります。単にあなたのItemsControl
秒のSelectedValueChanged
イベントに共通ハンドラをアタッチContent
を設定する
A.を使用したイベント。どちらかが選択を変更するたびに、ハンドラはContent
を選択したものに設定します。私はこれが最も簡単だと思います。
B.使用して、中間特性
バインドプロパティに各ItemsControl
のSelectedValue
。不動産のセッターでは、Content
もvalue
に設定します。これにより、イベントハンドラの代わりにデータバインディングを使用することができますが、それでもコードビハインドを記述する必要があり、あまり購入しません。もちろん、他の目的のためにプロパティにバインドしている場合は、余分なコストはほとんどありません(各セッターに割り当てのみ)ので、この方法が適している可能性があります。