2010-12-17 60 views

回答

1

我能夠使用以下概念得到這個工作。

  1. 將內容控件綁定到只讀屬性「SelectedItem」(使用私有屬性_selectedItem)。
  2. 將ListBox.SelectedItem綁定到讀/寫屬性「SelectedItemLB」。
  3. 在SelectedItemLB設置器中,設置_selectedItem的值,併爲SelectedItem引發PropertyChanged事件。
  4. 爲VreeView.SelectedItemChanged創建一個處理程序,該處理程序設置_selectedItem的值並引發SelectedItem的PropertyChanged事件。

這裏是我的全碼:

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

我想不出一種直接做到這一點的方法。然而,有幾個簡單的解決方案。

A.使用事件來設置Content

共同處理程序只需連接到您的ItemsControl S的SelectedValueChanged事件。只要其中一個人改變其選擇,處理程序就會將Content設置爲任何被選中的。我認爲這是最簡單的。

B.使用中介性質

綁定每個ItemsControl到屬性的SelectedValue。在物業的二傳手,也設置Content等於value。這使您可以使用數據綁定而不是事件處理程序,但它仍然需要您編寫代碼隱藏功能,並且它不會爲您購買太多。當然,如果你已經綁定到其他用途的屬性,幾乎沒有額外的成本(每個設置器中只有一個賦值),所以這種方法可能更可取。