2016-07-27 1 views
0

컨텍스트 메뉴에서 명령을 클릭하여 TreeView 내부의 항목에 명령을 실행할 수 있기를 원합니다. 항목이 특정 유형 (xxTreeViewItem이 2 개의 하위 유형이있는 인터페이스) 인 경우에만 더욱 구체적입니다.항목을 TreeView 내부에있는 컨텍스트 메뉴에 명령을 바인딩하는 방법?

<Grid Name="Root" commonExtensions:EnterKeyUpdateExtension.IsEnabled="True"> 

    <StackPanel Orientation="Vertical" Grid.Row="0"> 
     <Button Content="Center on" Command="{Binding Path=CenterOnCommand}" Margin="5,10,5,0"/> 
    </StackPanel> 
     <Grid> 
      <TreeView Grid.Row="0" Name="xxTreeView" DataContext="{Binding Path=xxViewModel}" ItemsSource="{Binding Path=Items}"> 
       <TreeView.ItemContainerStyle> 
        <Style TargetType="{x:Type TreeViewItem}"> 
         <Setter Property="ContextMenu"> 
          <Setter.Value> 
           <ContextMenu> 
            <MenuItem Header="Center On" Command="{Binding CenterOnCommand}"/> 
           </ContextMenu> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </TreeView.ItemContainerStyle> 
       <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Items}" DataType="{x:Type localViewItems:xxTreeViewItem}"> 
         <TextBlock Text="{Binding Name}" VerticalAlignment="Center"/> 
        </HierarchicalDataTemplate> 
       </TreeView.ItemTemplate> 
      </TreeView> 

상단의 버튼에있는 명령은 작동하지만 상황에 맞는 메뉴에서는 아래에서 작동하지 않습니다. 나는 여러 바인딩을 시도하고 조상을 발견했지만 그 중 아무 것도 작동하지 않습니다. XAML만의 솔루션이 있습니까?

답변

1

ContextMenu은 시각적 트리에 속하지 않으므로 TreeView의 DataContext를 상속하지 않습니다. 그래서 당신은 PlacementTarget 속성을 사용하여의 ContextMenu에 전달해야합니다

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=DataContext}"></Setter> 
     <Setter Property="ContextMenu"> 
      <Setter.Value> 
       <ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> 
        <MenuItem Header="Center On" Command="{Binding CenterOnCommand}" /> 
       </ContextMenu> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</TreeView.ItemContainerStyle> 

내가 당신에게 그것은 여전히 ​​작동하지

+0

을 도울 수 있기를 바랍니다, 명령 CenterOnCommand은 xxEditorViewModel입니다. TreeView에서 사용되는 xxViewModel은 xxEditorViewModel의 Property입니다. Setter의 AncestorType을 UserControl (맨 위)으로 설정하여 해결했습니다. 감사! – n0win0u

+0

Great @ n0win0u, 문제가 해결되어 기쁘게 생각합니다. –

관련 문제