2010-12-17 6 views

Antwort

1

Ich konnte dies mit dem folgenden Konzept arbeiten.

  1. Binden Sie das Inhaltssteuerelement an eine schreibgeschützte Eigenschaft "SelectedItem" (mit der privaten Eigenschaft _selectedItem).
  2. Binden Sie das ListBox.SelectedItem an eine Lese-/Schreibeigenschaft "SelectedItemLB".
  3. Legen Sie in dem SelectedItemLB-Setter den Wert von _selectedItem fest, und heben Sie das PropertyChanged-Ereignis für SelectedItem auf.
  4. Erstellen Sie einen Handler für VreeView.SelectedItemChanged, der den Wert von _selectedItem festlegt und das PropertyChanged-Ereignis für SelectedItem auslöst.

Hier ist mein vollständiger Code:

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; 
    } 

Das XAML ist ziemlich einfach:

<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

Ich kann nicht einen Weg finden, das direkt zu tun. Es gibt jedoch mehrere einfache Lösungen.

A. Verwenden Sie Ereignisse setzen die Content

einfach einen gemeinsamen Handler zu den SelectedValueChanged Ereignisse Ihres ItemsControl s befestigen. Wenn einer von ihnen seine Auswahl ändert, setzt der Handler den Wert Content auf das, was ausgewählt wurde. Ich denke, das ist am einfachsten.

B. Verwendung Intermediär Eigenschaften

Bind die SelectedValue jedes ItemsControl auf eine Eigenschaft. Setzen Sie auch Content der Einrichtung der Eigenschaft auf value. Dadurch können Sie Datenbindung anstelle von Ereignishandlern verwenden, aber Sie müssen immer noch Code-Behind schreiben, und es kostet Sie nicht viel. Natürlich, wenn Sie bereits für andere Zwecke an Eigenschaften gebunden sind, gibt es fast keine zusätzlichen Kosten (nur eine Zuweisung in jedem Setter), so dass diese Methode vorzuziehen sein könnte.

Verwandte Themen