我认为您阅读代码会非常困难,但我会尽力而为!
这是我的 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>>>
在视觉上,我得到了这样的东西:
现在,当我点击我的 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
与使用它们的对象不在同一可视化树上。你已经上升了两次
- 您需要转到
ContextMenu
,在那里您可以从ContextMenu.PlacementTarget
获取TreeViewItem
。 - 现在您可以沿着那棵树向上移动到父
TreeViewItem
。
当然,如果您只在数据项本身中引用父级,那会更容易。此外,您不需要访问 TreeViewItems
,因为您通常会根据需要绑定(bind)所有内容。
关于c# - 访问 TreeView 中的父节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098589/