2012-02-01 3 views
2

코드를 읽는 것이 매우 어려울 것이라고 생각하지만 최선을 다하겠습니다.TreeView의 부모 노드에 대한 액세스?

<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>>>

시각입니다 : 여기

내 XAML 코드입니다, 지금

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까지 얻을 필요가 당신이 ContextMenu.PlacementTarget에서 TreeViewItem를 얻을 수 있습니다, 올라갈 수 있습니다.
  2. 이제 해당 트리를 부모 TreeViewItem으로 이동할 수 있습니다.

물론 데이터 항목 자체에서 상위 항목에 대한 참조 만 있으면 쉽게 될 수 있습니다. 또한 대개는 모든 것을 필요에 따라 바인딩하므로 TreeViewItems에 액세스 할 필요가 없습니다.

+0

ContextMenu.PlacementTarget은 코드에서 DockPanel을 반환합니다. TreeViewItem에 캐스팅하려고하면 null이됩니다. 내가 놓친 게 있니? –

+0

직접 실행 창 (ctrl + D + ctrl + I)을 사용 했습니까? typeof()를 사용하여 객체에 액세스하고 유형을 확인하는 데 사용할 수 있습니다. 또한 트리 뷰에 대한 참조가 클래스의 구성원 인 경우 SelectedItem 속성을 사용하여 노드를 가져올 수 있습니다. 처음에는 전적으로 코드에서 트리 뷰와 관련된 문제를 겪고 있었고 XAML 데이터 바인딩을 사용하여 작업 할 수 있도록 확신했습니다. 그만한 가치가 있습니다. 컨텍스트 메뉴를 사용하지는 않았지만 작동 가능한 TreeView 샘플이 필요하다면 코드를 제공 할 수 있습니다. –

+0

@AnthonyMason : 당신이 이야기하고자하는 사람이 아닌 저자의 게시물에 대한 코멘트 섹션에서 누군가와 이야기한다면 'at'표기법을 사용하고 싶을 것입니다. 그렇지 않으면 주소를 지정하려는 사람에게 알리지 않습니다. –

관련 문제