c# - 访问 TreeView 中的父节点?

标签 c# wpf xaml treeview

我认为您阅读代码会非常困难,但我会尽力而为!

这是我的 xaml 代码:

<TreeView x:Name="stateMachinesView"
          DockPanel.Dock="Top"
          SelectedItemChanged="item_Selected"
          HorizontalAlignment="Stretch"
          VerticalAlignment="Stretch"
          ScrollViewer.HorizontalScrollBarVisibility="Disabled"
          BorderThickness="0">
<TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Value}">
        <HierarchicalDataTemplate.ItemTemplate>
            <DataTemplate>
                <DockPanel>
                    <DockPanel.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Create Thumbnail" 
                                      Click="MenuItemCreate_Click"/>
                        </ContextMenu>
                    </DockPanel.ContextMenu>
                    <Image>
                        <Image.Style>
                            <Style TargetType="Image">
                                <Style.Setters>
                                    <Setter Property="Source"
                                            Value="Resources\state.png"/>
                                </Style.Setters>
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Item2}"
                                                 Value="true">
                                        <Setter Property="Source"
                                                Value="Resources\state_init.png"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Image.Style>
                    </Image>
                    <TextBlock>
                        <TextBlock.Text>
                            <Binding Path="Item1"/>
                        </TextBlock.Text>
                    </TextBlock>
                </DockPanel>
            </DataTemplate>
        </HierarchicalDataTemplate.ItemTemplate>
        <DockPanel>
            <Image DockPanel.Dock="Left"
                   Source="Resources\state_machine.png"/>
                <TextBlock Text="{Binding Key}"/>
        </DockPanel>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>

这个项目的来源是Dictionary<string, ObservableCollection<Tuple<string, bool>>>

在视觉上,我得到了这样的东西:

Screenshot

现在,当我点击我的 MenuItem我得到了这段代码:

private void MenuItemCreate_Click(object sender, RoutedEventArgs e)
{
    string stateName =
        ((sender as FrameworkElement).DataContext as Tuple<string, bool>).Item1;
}

这里我可以用上面的代码访问State1_1,但是现在我想访问父节点SM1!

我尝试了很多东西,最接近(最接近解决方案)的是:

DependencyObject parent = VisualTreeHelper.GetParent(sender as DependencyObject);
while (!(parent is TreeViewItem))
    parent = VisualTreeHelper.GetParent(parent);

但它不起作用......

我也在考虑 XAML 中的模板,但我确信我可以在代码隐藏中轻松完成它!

最佳答案

ContextMenus 与使用它们的对象不在同一可视化树上。你已经上升了两次

  1. 您需要转到 ContextMenu,在那里您可以从 ContextMenu.PlacementTarget 获取 TreeViewItem
  2. 现在您可以沿着那棵树向上移动到父 TreeViewItem

当然,如果您只在数据项本身中引用父级,那会更容易。此外,您不需要访问 TreeViewItems,因为您通常会根据需要绑定(bind)所有内容。

关于c# - 访问 TreeView 中的父节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098589/

相关文章:

c# - 对浮点变量求反的不同方法会生成不同的程序集

wpf - 使用 Blend 生成的 xaml

c# - 更新 silverlight 中的属性绑定(bind)

.net - 如何在 VS2008 中禁用 Cider(WPF Gui 编辑器)?

c# - Xamarin Forms 找不到如何将对象与详细信息 View 绑定(bind)

c# - 如何利用 OnModelCreating (Fluent Api EF) 中定义的现有键与 OData v4 中的 ODataModelBuilder 一起工作?

c# - Entity Framework 6 : Skip() & Take() do not generate SQL, 相反,结果集在加载到内存后被过滤。还是我做错了什么?

c# - LINQ - 展平嵌套序列,使其与父序列连接

wpf - XAML - 使用来自另一个程序集的资源字典中的字体

c# - 如何在 winRT xaml 应用程序中启动 native map 应用程序?