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