Wpf TreeViewItem 上下文菜单命令绑定不起作用

Wpf TreeViewItem Contextmenu Command binding not working

我想为 TreeViewItem 创建一个 ContextMenu 并将参数作为 TreeViewItem 数据上下文(而不是 TreeView 数据上下文)传递。

我收到以下命令绑定错误。问题是什么? 我还尝试了 TreeViewItemMenuItemContextMenu 作为 AncestorType。 我也试过 AncestorLevel123,但并没有改变结果。

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.TreeView', AncestorLevel='1''. BindingExpression:Path=DataContext.DeleteFolderCommand; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Command' (type 'ICommand')

这是我的代码:

<TreeView ItemsSource="{Binding Folders}">
   <TreeView.ItemContainerStyle>
      <Style TargetType="{x:Type TreeViewItem}"
             BasedOn="{StaticResource {x:Type TreeViewItem}}">
         <Setter Property="ContextMenu">
            <Setter.Value>
               <ContextMenu>
                  <MenuItem Header="Sil"
                            Command="{Binding DataContext.DeleteFolderCommand,RelativeSource={RelativeSource AncestorType={x:Type TreeView},Mode=FindAncestor}}"
                            CommandParameter="{Binding }"></MenuItem>
               </ContextMenu>
            </Setter.Value>
         </Setter>
      </Style>
   </TreeView.ItemContainerStyle>
</TreeView>

ContextMenu 与其关联控件不属于同一可视化树,因此 RelativeSource 绑定不起作用。

改为将 TreeViewItemTag 属性 绑定到父 TreeViewDataContext。然后就可以通过上下文菜单中的PlacementTarget 属性访问这个属性,设置为对应的TreeViewItem.

<TreeView.ItemContainerStyle>
   <Style TargetType="{x:Type TreeViewItem}"
          BasedOn="{StaticResource {x:Type TreeViewItem}}">
      <Setter Property="Tag" Value="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type TreeView}}}"/>
      <Setter Property="ContextMenu">
         <Setter.Value>
            <ContextMenu>
               <MenuItem Header="Sil"
                         Command="{Binding PlacementTarget.Tag.DeleteFolderCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                         CommandParameter="{Binding}"></MenuItem>
            </ContextMenu>
         </Setter.Value>
      </Setter>
   </Style>
</TreeView.ItemContainerStyle>