Доступ к родительскому узлу в TreeView? - PullRequest
2 голосов
/ 01 февраля 2012

Думаю, вам будет очень трудно читать код, но я постараюсь сделать все возможное!

Вот мой код 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 Ответ

2 голосов
/ 01 февраля 2012

ContextMenus находятся не в том же визуальном дереве, что и объект, на котором они используются.Вы поднялись дважды

  1. Вам нужно подняться на ContextMenu, там вы можете получить TreeViewItem от ContextMenu.PlacementTarget.
  2. Теперь вы можете поднятьсяэто дерево для родителя TreeViewItem.

Конечно, было бы проще, если бы вы просто имели ссылку на родителя в самих элементах данных.Также вам не нужно обращаться к TreeViewItems, так как вы обычно связываете все по необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...