访问TreeView中的父节点?

时间:2012-02-01 15:35:14

标签: 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中的模板,但我确信我可以轻松地在代码隐藏中做到这一点!

1 个答案:

答案 0 :(得分:2)

ContextMenus与它们所使用的对象不在同一个可视树中。你有两次上涨

  1. 您需要前往ContextMenu,您可以从TreeViewItem获取ContextMenu.PlacementTarget
  2. 现在,您可以将该树上移到父TreeViewItem
  3. 当然,如果您只是在数据项本身中引用父项,那将会更容易。此外,您不需要访问TreeViewItems,因为您通常会根据需要绑定所有内容。