【问题标题】:Which item was selected in my TreeView在我的 TreeView 中选择了哪个项目
【发布时间】: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


    【解决方案1】:

    查找 VisualTree 怎么样?您可以向上直到到达顶部项目。在您评估所有单项之前。

    【讨论】:

    • 我尝试了 VisualTree,但除了获取父级之外,还有更多内容。最终我成功了。我会接受你的回答。
    • 我想我遇到了完全相同的问题!你是怎么做到的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多