绑定命令 - 祖先

时间:2016-03-14 21:32:03

标签: c# wpf xaml data-binding relativelayout

好的,伙计们。我现在已经尝试了大约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; ElementName&#39;来自整个节目,但它永远不会被接收
  • 更改&#39; AncestorLevel&#39;猥亵数字,希望这是问题
  • 还有更多..

不确定哪些对你们有用,但下面是我得到的输出信息

找不到用于引用的绑定源&#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;)

由于

1 个答案:

答案 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>