2011-04-24 91 views
1

我有一個帶有兩個使用控件的窗口。一個封裝一個TreeView控件,另一個僅僅是一個選擇的TreeViewItems細節的字符串表示。從根容器中獲取TreeViewItem datacontext

TreeView控件已經是自給自足了 - 它將自己填充內容項目。每個TreeViewItem都有一個數據上下文。

以下是我需要發生:

  1. 每當用戶點擊一個項目,它產生在我的窗口的根容器被抓爲選定的路由事件。
  2. 我需要事件處理程序,它處理選定的路由事件,以便能夠從選定的TreeViewItem的數據上下文中獲取某些數據(屬性值)。
  3. 基於這個值,我的事件處理程序將創建一個DetailsView控件並將其填充數據。

我的方法在處理選定事件方面是否正確?我如何從我選擇的項目數據上下文中獲取屬性值?

謝謝。

回答

0

將屬性綁定到TreeView的SelectedItem可以解決您的問題。下面的代碼表達了我正在考慮的內容。對於您擁有的兩個UC,您可以爲SelectedItem公開一個屬性。

XAML:

<TreeView x:Name="Tree1"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
      <TextBlock Text="{Binding Name}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 
<TextBlock Text="{Binding ElementName=Tree1,Path=SelectedItem.Name}" /> 

實體項目

public class Item 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private string name; 
    private Collection<Item> items; 

    public Collection<Item> Items { get { return items; } } 

    public Item() 
    { 
     items = new Collection<Item>(); 
    } 

    public string Name 
    { 
     get { return name; } 
     set { name = value; OnPropertyChanged("Name"); } 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

綁定源

Item item = new Item { Name = "A" }; 
item.Items.Add(new Item { Name = "A_1" }); 
item.Items.Add(new Item { Name = "A_2" }); 
item.Items.Add(new Item { Name = "A_3" }); 
Tree1.ItemsSource = new Collection<Item>() { item }; 
+1

我與項目結合沒有問題。我的問題是關於處理Item.Selected事件並從頂級代碼中獲取所選的TreeViewItem數據上下文。 – 2011-04-25 14:56:30