如何从一个ContextMenu菜单项通过可视化树访问控制?(How to access a con

2019-06-26 01:10发布

这似乎是一个相当热门的话题,但是...

我有以下XAML:

<internal:MyCommandObject x:Name="CommandModel"/>

<Button DockPanel.Dock="Bottom" Command="{Binding DoAction, ElementName=CommandModel}">
    <Button.ContextMenu>
        <ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">
            <MenuItem Command="{Binding DoAction, ElementName=CommandModel}"/>
        </ContextMenu>
    </Button.ContextMenu>
    Click Me
</Button>

现在, MyCommandObject是从其露出动态命令的控制DataContext 。 你知道接下来会发生什么。 :)

基本上,按钮命令完美的作品-当我点击它,在DoAction的命令MyCommandObject得到完全执行。 然而,在菜单项的命令没有得到执行。 我尝试过各种手段,例如设置上下文菜单datacontextplacementTarget所以它可以遍历控件的可视化树等,但没有在做。

什么特别对准RelativeSourceCommandTarget做符文我需要得到这个工作?

Answer 1:

这是因为发生DataContext="{Binding PlacementTarget,...结合将设置按钮的MenuItems DataContext但不会添加ContextMenu您窗口的VisualTree,这就是为什么ElementName约束力的都不行。一个简单的解决方法使用ElementName绑定是在你的窗口/用户控件的代码隐藏补充一点:

NameScope.SetNameScope(contextMenuName, NameScope.GetNameScope(this)); 

另一种解决方案是要做到这一点 -

<ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">   
    <MenuItem Command="{Binding DataContext.DoAction}"/>   
</ContextMenu>

DataContext="{Binding PlacementTarget,...将设置按钮(Placementtarget)为您的文本菜单的DataContext的,所以你可以使用按钮的DataContext的绑定命令。

更新:

你可以尝试使用NameScope.NameScope附加属性设置名称范围XAML中,但我不知道你是如何让父窗口的名称范围无码!

你将不得不做一些类似的约什 - 史密斯下面的文章什么的,他提供了一种在XAML做到这一点; 但同样涉及到代码(更多随后的代码,单行) -

启用与ElementSpy的ElementName绑定

任何具体的理由不使用这一行代码?



文章来源: How to access a control from a ContextMenu menuitem via the visual tree?