从根容器获取TreeViewItem datacontext

时间:2011-04-24 16:37:47

标签: wpf routed-events

我有一个带有两个使用控件的Window。一个封装了TreeView控件,另一个封装了所选TreeViewItems详细信息的字符串表示。

TreeView控件已经足够了 - 它将使用内容项填充自身。每个TreeViewItem都有一个datacontext。

以下是我需要发生的事情:

  1. 每当用户点击某个项目时,它都会生成一个已选中的路由事件,该事件正在我窗口的根容器中捕获。
  2. 我需要事件处理程序,它处理Selected routed事件,以便从所选的TreeViewItem的数据上下文中获取一些数据(属性值)。
  3. 根据此值,我的事件处理程序将创建一个DetailsView控件,并使用数据填充它。
  4. 在处理Selected事件方面,我的方法是否正确?如何从我选择的项目数据上下文中获取属性值?

    谢谢。

1 个答案:

答案 0 :(得分: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 };