2012-11-16 32 views
8

階層データテンプレートを使用してwpfのツリービュー項目のコンテキストメニューを表示する方法はありますか?唯一CountryTemplateのコンテキストメニューを表示する方法:あなたが見ることができるようにwpfの階層データテンプレートのツリービュー項目のコンテキストメニューを表示する方法

<HierarchicalDataTemplate x:Key="DispTemplate"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Path=Label}" Style="{StaticResource TreeTextStyle}" ToolTip="{Binding Path=Description}" Tag="{Binding Path=Tag}"> 
      </TextBlock> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate x:Key="BuildingTemplate" ItemsSource="{Binding Path=Building}" ItemTemplate="{StaticResource BuildingTemplate}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Path=Label}" Style="{StaticResource TreeTextStyle}" ToolTip="{Binding Path=Description}"/> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate x:Key="CityTemplate" ItemsSource="{Binding Path=City}" ItemTemplate="{StaticResource CityTemplate}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Path=Label}" Style="{StaticResource TreeTextStyle}" ToolTip="{Binding Path=Description}"/> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate x:Key="CountryTemplate" ItemsSource="{Binding Path=Country}" ItemTemplate="{StaticResource CountryTemplate}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Path=RootName}" Style="{StaticResource TreeTextStyle}" ToolTip="{Binding Path=Description}"/> 
     </StackPanel> 
    </HierarchicalDataTemplate> 

答えて

11

のItemcontainerstyleであなたのコンテキストメニューを追加することができます例えば、データテンプレート、:

<HierarchicalDataTemplate x:Key="CountryTemplate" ItemsSource="{Binding Path=Country}" ItemTemplate="{StaticResource CountryTemplate}"> 
    <StackPanel Orientation="Horizontal"> 
     <StackPanel.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Header" Command="{Binding Command}"/> <!--This command should be in the data context (each country item)--> 
      </ContextMenu> 
     </StackPanel.ContextMenu> 
     <TextBlock Text="{Binding Path=RootName}" Style="{StaticResource TreeTextStyle}" ToolTip="{Binding Path=Description}"/> 
    </StackPanel> 
</HierarchicalDataTemplate> 
+0

viewmodelのルートに定義されているコマンドにバインドする方法を教えてください。これまでFindAncestorメソッドは機能していません。私にこれの例を教えてもらえますか? – TrustyCoder

+0

私はバインディングのためのビューモデルにeaslyアクセスできない場合、このFindAncestorバインディングを試してみます:Command = "{バインディングDataContext.Command、RelativeSource = {RelativeSource FindAncestor、AncestorType = {x:MainWindowのタイプ}}}一般的にメインウィンドウのdatacontextにはルートビューモデルがあり、必要なコマンドがあります。 –

+0

ビジュアルツリーの一部ではないため、何らかの理由でコンテキストメニューが動作しません。 – TrustyCoder

3
<HierarchicalDataTemplate x:Key="CountryTemplate" ItemsSource="{Binding Path=Country}" ItemContainerStyle="{StaticResource CountryTemplateItemContainerStyle}" ItemTemplate="{StaticResource CountryTemplate}"> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding Path=RootName}" Style="{StaticResource TreeTextStyle}" ToolTip="{Binding Path=Description}" /> 
         </StackPanel> 
</HierarchicalDataTemplate> 


<Style x:Key="CountryTemplateItemContainerStyle" TargetType="{x:Type TreeViewItem}"> 
<Setter Property="ContextMenu" Value="{DynamicResource TreeViewContextMenu}"/> 
</Style> 
<ContextMenu x:Key="TreeViewContextMenu"> 
     <MenuItem .../> 
</ContextMenu> 

、あなたはまた、任意の子ビジュアルにContextMenuを追加することができますHierarchicalDataTemplate

+0

これは私のために動作しませんでした。 – TrustyCoder

+0

これは私のためにはうまくいきました。ContextMenuがItemの近くでどのように定義されているのが好きです。 –

+0

これは私のために働いた。コンパイルエラーを避けるために、ブロックをスワップしなければなりません(XAMLタグ 'HierarchicalDataTemplate'が' Style'と 'ContextMenu'タグの後に来るようにしてください)。その理由は、ContextMenuをスタイルに移動するとすべてがより密接に関連するビジュアルツリーにシフトするため、DataContextが問題なく見つかることができるからです。 – Contango

3

は基本的に私はこの

を思い付い
<HierarchicalDataTemplate x:Key="ChildTemplate"> 
      <StackPanel Orientation="Horizontal"> 
       <StackPanel.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="Copy" CommandParameter="{Binding CopyTag}"> 
         </MenuItem> 
         <MenuItem Header="Paste" CommandParameter="{Binding PasteTag}"> 
         </MenuItem> 
         <ContextMenu.ItemContainerStyle> 
          <Style TargetType="MenuItem"> 
           <Setter Property="Command" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.CopyPaste}"/> 
          </Style> 
         </ContextMenu.ItemContainerStyle> 
        </ContextMenu> 
       </StackPanel.ContextMenu> 
       <Image Source="/Images/Child.png" Stretch="None" VerticalAlignment="Center" HorizontalAlignment="Center" Style="{StaticResource TreeIconStyle}"/> 
       <TextBlock Text="{Binding Path=Label}" Style="{StaticResource TreeTextStyle}" ToolTip="{Binding Path=Description}" Tag="{Binding Path=Tag}"> 
       </TextBlock> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

また、1つのコマンドでコピーと貼り付けを区別するために、コピーと貼り付けに別々のパラメータを設定します。

2

コンテキストメニューがデフォルトでは他のすべてのビジュアルツリーとは異なるため、コンテキストメニューが正常に機能しない理由の1つは、DataContextが見つかりません。

キー洞察は は、コンテキスト メニューをフックし、ターゲット要素にそのスタイルを添付して、コンテキストメニューを定義する<Style>を作成することです。 コンテキストメニューを視覚ツリーにシフトします。視覚的なツリーは、デフォルトのDataContextになります。

まず、スタイルを作成:、その後

<UserControl.Resources>                               
    <ResourceDictionary> 

     <!-- For the context menu to work, we must shift it into a style, which means that the context menu is now in a 
     visual tree that is more closely related to the current data context. All we have to do then is set the style, 
     which hooks up the context menu. --> 
     <Style x:Key="ContextMenuStyle" TargetType="{x:Type StackPanel}"> 
      <Setter Property="ContextMenu" Value="{DynamicResource TreeViewContextMenu}"/> 
     </Style> 
     <ContextMenu x:Key="TreeViewContextMenu"> 
      <MenuItem Header="Test" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.CmdDisplayDetailsGraph}"/> 
     </ContextMenu> 

を異なる視覚木々によって引き起こされる問題に実行せずに、アップどこでもしたいコンテキストメニューをフック。

例1:

<HierarchicalDataTemplate DataType="{x:Type snapshot:Details}" ItemsSource="{Binding DetailsList}"> 
    <StackPanel Orientation="Vertical" Style="{StaticResource ContextMenuStyle}"> 
     <ContentPresenter Content="{Binding}" ContentTemplate="{Binding View.DefaultDataRowTemplate}" /> 
</StackPanel> 

例2:

<DataTemplate DataType="{x:Type snapshot:InstrumentDetails}"> 
    <StackPanel Orientation="Vertical" Style="{StaticResource ContextMenuStyle}">     
     <Grid HorizontalAlignment="Stretch" VerticalAlignment="Center"> 
関連する問題