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