C# WPF中ContextMenu中的CommandParameters

C# WPF中ContextMenu中的CommandParameters,c#,wpf,.net-3.5,C#,Wpf,.net 3.5,我有一个场景,其中我有一个WPF TreeView控件,它的项有一个HierarchycalDataTemplate。现在在层次数据模板中,我有一个标签,标签有一个上下文菜单,菜单项用于删除。“删除”菜单项绑定到名为DeleteCommand的命令,该命令是类的一部分,该类已被设置为层次数据模板的数据类型 现在,我想传递ContextMenu的Deletemenuitem的DeleteCommand的CommandParameters中的TreeView控件,以便在删除当前所选项时处理treev

我有一个场景,其中我有一个WPF TreeView控件,它的项有一个
HierarchycalDataTemplate
。现在在
层次数据模板
中,我有一个
标签
标签
有一个
上下文菜单
,菜单项用于
删除
。“删除”菜单项绑定到名为
DeleteCommand
的命令,该命令是类的一部分,该类已被设置为
层次数据模板的
数据类型

现在,我想传递ContextMenu的
Delete
menuitem的
DeleteCommand
CommandParameters
中的
TreeView
控件,以便在删除当前所选项时处理treeviews项的选择

但是,如果我将
CommandParameters
绑定为
{Binding ElementName=TreeViewName}
或其他类似的内容,那么它总是空的,除非绑定的元素是
数据上下文中的属性


有人能帮我解决吗?因为我想,我已经尝试了所有可能的方法,比如RelativeSource和AncestorType等,但它总是空的。在我看来,它要么是框架中的一个限制,要么是框架中的一个bug。

请看一看。也许它可以提供一些关于发生了什么的指针。

问题是ContextMenu位于它自己的可视树的根,因此任何RelativeSource.FindAncestor绑定都不会经过ContextMenu

一种解决方案是使用属性从标签设置两阶段绑定:

<Label Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={
    x:Type TreeView}}}">
    <Label.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Delete" Command="{x:Static local:Commands.DeleteCommand}"
                CommandParameter="{Binding PlacementTarget.Tag, RelativeSource={
                RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
        </ContextMenu>
    </Label.ContextMenu>
</Label>

然而,这是相当骇人听闻的。最好将MenuItem的属性设置为ContextMenu的PlacementTarget,并在TreeView上使用命令处理程序。这意味着您不必将树视图传递给其他人。


<MenuItem Header="..." 
          Command="{Binding Path=...}" 
          CommandParameter="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType={x:Type ContextMenu}}}">
</MenuItem>
ContextMenu.PlacementTarget是menuitem所在的标签。从Lavel可以访问其父树视图。


<ContextMenu>
    <MenuItem Header="Edit Item"
                   Command="{Binding EditItemCommand, Mode=OneWay}"
                   CommandParameter="{Binding Path=UIElement.(views:DataGridView.SelectedItems), RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" />
<ContextMenu>

数据网格中每个元素的

<ContextMenu>
    <MenuItem Header="Edit Item"
                   Command="{Binding EditItemCommand, Mode=OneWay}"
                   CommandParameter="{Binding Path=PlacementTarget.SelectedItem, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" />
<ContextMenu>


Way easy:@JoanComas:在尝试了所有其他方法都没有成功(也不理解FindAncestors等的含义)之后,您的方法easy Way工作得非常完美!谢谢。@JoanComasFdz的评论真的很有帮助。我可以简单地应用
CommandParameter=“{Binding}”