【发布时间】:2011-11-26 15:31:04
【问题描述】:
在我的应用程序中,我通过绑定构建了一个 TreeView。 ItemSource 包含 X 类型的项目列表。
X 有一个属性“Properties”,其中一些属性是对父列表中某个项目的引用。
TreeView 从选定的根(列表中的一项)开始。所有作为引用的属性都作为 TreeViewItems 添加到此根。但是,它们也可以扩展直到达到或不达到终点;我的意思是,这在理论上可能是无限递归,因为引用可能引用自身。
现在的问题是,我怎么知道选择了哪个项目?
我需要知道关卡及其所有父级。
我想到了这些事情:
- 在扩展树的同时,跟踪关卡和父级。
这显然不起作用,因为在选择不同父项下的其他项目后,我忘记了其他路径。 - 检查
e.OldValue。由于与上一次尝试相同的原因,这也不起作用。 - 在扩展(以及创建)TreeView 的同时,在代码后面的 c# 中构造一个类似于 TreeView 的变量。
起初,这似乎与解决方案非常接近,因为您无法从它们创建的 TreeView 中删除节点。例如:您进入第 5 层并折叠了第 1 层。如果您展开第一层,您会看到与折叠前完全相同的路径。
要以这种方式创建 TreeView,我必须重写 DataTemplateSelector。 (C#)
public class TreeViewDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null)
{
if (item is Entity)
return element.FindResource("XTemplate") as DataTemplate;
else
return element.FindResource("PropertyWithReferenceTemplate") as DataTemplate;
}
return null;
}
}
Binding 和 HierarachialDataTemplate。 (Xaml)
<TreeView ItemsSource="{Binding ElementName=view, Path=XDefinition}" ItemTemplateSelector="{StaticResource treeViewDataTemplateSelector}" SelectedItemChanged="TreeView_SelectedItemChanged">
<TreeView.Resources>
<HierarchicalDataTemplate x:Key="XTemplate" ItemsSource="{Binding Path=Properties}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="PropertyWithReferenceTemplate" ItemsSource="{Binding Path=ReferenceToX.Properties,}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
有人可以帮我解决这个问题吗?
如果您还有什么需要知道的,请告诉我,我会更新我的问题。
解决方案 我不得不将我的事件 SelectedItemChanged="TreeView_SelectedItemChanged" 更改为 TreeViewItem.Selected="TreeViewItem_Selected"。在 LogicalTreeHelper.GetParent 的帮助下,我能够检索到正确的父级。
【问题讨论】:
标签: c# wpf xaml recursion treeview