好的,伙计们。我现在已经尝试了大约3天了,谷歌搜索没有任何帮助。下面是我的XAML的片段(应该足够跟随)。 我的问题是" ContextMenu"的命令。 如您所见,我有 DeleteTagCommand 。现在,如果我将它放在 CheckBoxCommand 的位置,该命令就可以工作了,这很棒..但它只会在它的当前位置被调用,而且它让我疯了
<ScrollViewer Grid.Column="0">
<StackPanel Orientation="Vertical">
<ItemsControl ItemsSource="{Binding Tags, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Value}" Margin="10,5,10,5" Command="{Binding DataContext.CheckBoxCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Grid}}}"
CommandParameter="{Binding }">
<CheckBox.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete" Command="{Binding DataContext.DeleteTagCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Grid}}}"
CommandParameter="{Binding}" />
</ContextMenu>
</CheckBox.ContextMenu>
</CheckBox>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</ScrollViewer>
我试过了:
不确定哪些对你们有用,但下面是我得到的输出信息
找不到用于引用的绑定源&#39; RelativeSource FindAncestor,AncestorType =&#39; System.Windows.Controls.Grid&#39;,AncestorLevel =&#39; 1&#39;&#39 ;。 BindingExpression:路径= DataContext.DeleteTagCommand;的DataItem = NULL;目标元素是&#39; MenuItem&#39; (名称=&#39;&#39);目标财产是&#39; Command&#39; (键入&#39; ICommand&#39;)
由于
答案 0 :(得分:2)
ContextMenus实际上并不是与父级相同的可视树的一部分,因此它们无法直接绑定到其中的任何元素。但是,它们仍然可以绑定到StaticResources。诀窍是使用中间代理,例如BindingProxy class shown on this page。首先在ItemsControl
资源块中添加一个实例:
<ItemsControl.Resources>
<local:BindingProxy x:Key="Proxy" Data="{Binding}" />
</ItemsControl.Resources>
然后用它来绑定你的ContextMenu
命令:
<ContextMenu>
<MenuItem Header="Delete" Command="{Binding Data.DeleteTagCommand, Source={StaticResource Proxy}}" CommandParameter="{Binding}" />
</ContextMenu>