我如何以编程方式关闭ContextMenu

时间:2015-12-03 16:48:41

标签: c# wpf contextmenu

有一个ContextMenu,其中弹出一些控件:

<ContextMenu>
    <StackPanel Orientation="Vertical">
        <TextBox Text="{Binding Path=PlacementTarget.Tag.DataContext.AddFolderName, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"></TextBox>
        <Button Content="Create here"
            Command="{Binding Path=PlacementTarget.Tag.DataContext.AddFolderCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}">
        </Button>
    </StackPanel>
</ContextMenu>

当用户右键单击并且一切都与世界相符时,这会打开和关闭。但是,如果用户也按下按钮,我想关闭此菜单。

我之前使用按钮单击弹出窗口完成此操作 - 如果用户单击按钮打开弹出窗口,您可以在执行的命令中设置IsOpen布尔属性,并显示弹出窗口。

但似乎没有相应的方式来进入&#34;菜单打开&#34;在上下文菜单上的功能。至少不是我能找到的。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

There is an IsOpen in ContextMenu too.您可以将它绑定到ViewModel中的属性,就像绑定Command一样,并让<ContextMenu IsOpen="{Binding Path=PlacementTarget.Tag.DataContext.IsOpen, Mode=TwoWay RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"> 将该属性设置为false。例如:

AddFolderCommand.Execute

然后在IsOpen = false您可以PlacementTarget.Tag.DataContext

这提供ContextMenu实际上是您需要的ViewModel。请注意,DataContext使用自己的窗口来阻止DataContext继承。你可以选择几种方法:

  • 明确指出绑定中使用ElementName的另一个元素或其DataContext="{Binding ElementName=other, Path=DataContext}"/>ContextMenu
  • 使用Parent属性访问声明{Binding Path=Parent.DataContext, RelativeSource={RelativeSource Self}}的元素:DataContext={Binding Source={x:Static local:YourStaticViewModel}
  • 使用静态ViewModel:ContextMenu

如果您不想从ViewModel执行此操作,则可以使用代码隐藏中的事件:只需为IsOpen命名,以便您可以从代码隐藏中访问它,处理按钮上的click事件,然后在事件处理程序上将{{1}}设置为false。

答案 1 :(得分:-1)

您可以使用可见性属性:

myContextMenu.Visibility = Visibility.Collapsed;