2012-02-01 3 views
2

Я думаю, вам будет очень сложно прочитать код, но я постараюсь сделать все возможное!Доступ к родительскому узлу в 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, но я уверен, что могу легко сделать это в коде!

+0

Вы ищете простой способ петли через Treeview ..? если это так, я могу вставить очень простой пример, который вы можете использовать в качестве стартера в своем коде позади. – MethodMan

ответ

2

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

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

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

+0

ContextMenu.PlacementTarget возвращает DockPanel в моем коде. Если я попытаюсь передать его в TreeViewItem, я получил null. Я что-то упускаю ? –

+0

Вы использовали непосредственное окно (ctrl + D + ctrl + I)? Это можно использовать для доступа к объекту и просмотра типа с помощью typeof(). Кроме того, если у вас есть ссылка на древовидное представление как член класса, вы можете использовать свойство SelectedItem для получения узла. Первоначально у меня возникали проблемы с древовидным представлением полностью в коде, а затем я был убежден, что он работает с привязкой данных XAML. Это того стоит. Если вам нужен функциональный образец TreeView, я могу предоставить свой код, хотя я не использовал контекстное меню, он все равно может помочь. –

+0

@AnthonyMason: вы хотите использовать нотацию «в» (как я обращаюсь к вам сейчас), если вы поговорите с кем-то в разделе комментариев о должности, автором которой не является человек, с которым вы собираетесь поговорить. В противном случае человек, на которого вы намерены обратиться, не уведомляется. –

Смежные вопросы