2010-12-17 13 views

答えて

1

私は以下の概念を使用してこれを実現できました。

  1. コンテンツコントロールを読み取り専用プロパティ "SelectedItem"(プライベートプロパティ_selectedItem)にバインドします。
  2. ListBox.SelectedItemを読み取り/書き込みプロパティ "SelectedItemLB"にバインドします。
  3. SelectedItemLBセッターで_selectedItemの値を設定し、SelectedItemのPropertyChangedイベントを発生させます。
  4. _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.使用して、中間特性

バインドプロパティに各ItemsControlSelectedValue。不動産のセッターでは、Contentvalueに設定します。これにより、イベントハンドラの代わりにデータバインディングを使用することができますが、それでもコードビハインドを記述する必要があり、あまり購入しません。もちろん、他の目的のためにプロパティにバインドしている場合は、余分なコストはほとんどありません(各セッターに割り当てのみ)ので、この方法が適している可能性があります。

関連する問題