WPF:正确地将对象存储在TreeViewItem中

时间:2009-04-05 12:15:43

标签: wpf treeview casting

要在TreeViewItem中存储对象(比如一个类的实例),我当前正在TreeViewItem的{​​{1}}中存储该对象,然后覆盖Header方法该类,以便它显示正确的字符串标题;然后我在活动期间将物体抛回。


这是实现此类事情的正确方法,还是有更好,更正确的方法?

2 个答案:

答案 0 :(得分:7)

“正确”的方法是将object添加到TreeView'(或TreeViewItem')Items集合并使用{{1}控制项目的呈现方式:

Person.cs

HierarchicalDataTemplate

Window1.xaml.cs

public class Person
{
    private readonly ICollection<Person> _children = new ObservableCollection<Person>();

    public string Name { get; set; }

    public ICollection<Person> Children
    {
        get
        {
            return _children;
        }
    }
}

Window1.xaml

public Window1()
{
    InitializeComponent();

    var people = new List<Person>();
    var kent = new Person() { Name = "Kent" };
    kent.Children.Add(new Person() { Name = "Tempany" });
    people.Add(kent);
    _treeView.ItemsSource = people;
}

答案 1 :(得分:1)

我认为上面的“答案”没有回答实际问题,实际上原来的问题表明作者的问题已经有了解决问题的非常有效的方法。但是,提供的“答案”仅显示如何将子对象附加到TreeViewItem以及如何使用自定义方法随后呈现它。虽然这很有用,但这个答案并没有解决原始问题的实际性质。

在许多情况下,TreeViewItem需要附加一个不属于TreeViewItem的Items列表的外部对象。当用户从TreeView中选择TreeViewItem时,这有助于访问附加的外部对象以用于特定于应用程序的目的。这个概念与将子对象添加到TreeViewItem的想法完全不同。

与问题作者最初实现的解决方案相反,解决此问题的另一种方法是对TreeViewItem类进行子类化并添加自定义信息,例如附加对象。这一原则在http://msdn.microsoft.com/en-us/library/1330h6a4.aspx一文中有所说明。在实现此自定义TreeViewItem子类之后,可以将此子类添加到TreeView或TreeViewItem的Items列表中。当用户从TreeView中选择项目时,从选择中返回的对象将是自定义子类,它将包含子类定义的任何自定义信息。

使用自定义TreeViewItem子类而不是TreeViewItem的另一个好处是自定义行为可以由子类实现。例如,要在用户将鼠标悬停在项目上时显示自定义工具提示,子类可以为自己设置ToolTip对象,其代码如下:

ToolTip tip = new ToolTip() { Content = "Tooltip display value" };
ToolTipService.SetToolTip(this, tip);