WPF:在TreeViewItem中正确存储对象

WPF:在TreeViewItem中正确存储对象,wpf,treeview,casting,Wpf,Treeview,Casting,为了在TreeViewItem中存储一个对象(比如,一个类的实例),我当前正在将该对象存储在TreeViewItem的头文件中,然后覆盖该类的ToString方法,以便它显示正确的字符串头文件;然后,我在一个事件中将该对象抛回 这是实现这类事情的正确方法,还是有更好、更正确的方法?正确的方法是将对象添加到树视图(或树视图项)的项集合中,并使用层次数据模板控制项目的呈现方式: Person.cs: 公共类人物 { 私有只读ICollection_children=新的ObservableColl

为了在TreeViewItem中存储一个对象(比如,一个类的实例),我当前正在将该对象存储在
TreeViewItem
头文件中,然后覆盖该类的
ToString
方法,以便它显示正确的字符串头文件;然后,我在一个事件中将该对象抛回


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

正确的方法是将
对象添加到
树视图(或
树视图项
)的
集合中,并使用
层次数据模板
控制项目的呈现方式:

Person.cs:

公共类人物
{
私有只读ICollection_children=新的ObservableCollection();
公共字符串名称{get;set;}
公共ICollection儿童
{
得到
{
返回儿童;
}
}
}
Window1.xaml.cs:

公共窗口1()
{
初始化组件();
var people=新列表();
var kent=newperson(){Name=“kent”};
Add(newperson(){Name=“Tempany”});
人民。加上(肯特);
_treeView.ItemsSource=人;
}
Window1.xaml:


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

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

与问题作者最初实现的解决方案不同,解决此问题的另一种方法是对TreeViewItem类进行子类化,并添加自定义信息,例如附加对象。本文阐述了这一原则。实现此自定义TreeView项子类后,可以将此子类添加到TreeView或TreeView项的项列表中。当用户从TreeView中选择项时,从选择返回的对象将是自定义子类,它将包含子类定义的任何自定义信息

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

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

谢谢你的回答。可以说,如何实现“嵌套的HierarchycalDataTemplate”?例如,ItemsSource绑定中的项在其中有另一个列表,我希望该列表是它们的子列表。np Dreas。是否可以标记为答案,并针对嵌套的HierarchycalDataTemplates单独提问?
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;
}
<TreeView x:Name="_treeView">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Person}" ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>
ToolTip tip = new ToolTip() { Content = "Tooltip display value" };
ToolTipService.SetToolTip(this, tip);