有一个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;在上下文菜单上的功能。至少不是我能找到的。有人能指出我正确的方向吗?
答案 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
{Binding Path=Parent.DataContext, RelativeSource={RelativeSource Self}}
的元素:DataContext={Binding Source={x:Static local:YourStaticViewModel}
ContextMenu
如果您不想从ViewModel执行此操作,则可以使用代码隐藏中的事件:只需为IsOpen
命名,以便您可以从代码隐藏中访问它,处理按钮上的click事件,然后在事件处理程序上将{{1}}设置为false。
答案 1 :(得分:-1)
您可以使用可见性属性:
myContextMenu.Visibility = Visibility.Collapsed;