【发布时间】:2012-04-13 22:55:50
【问题描述】:
最近我正在 WPF 中开发一个上下文菜单,具有以下要求,
如果上下文菜单中的所有菜单项都隐藏了可见性,请将上下文菜单的可见性设置为隐藏。
我自己在 DataTemplate 中有一个解决方案,即将 ContextMenu Hidden 设置为默认值,并为每个菜单项使用 Trigger 来检查它们的可见性,如果它们中的任何一个可见,则将 ContextMenu 可见性触发为可见。
所以代码是这样的
<DataTemplate>
<ContextMenu Visibility="Hidden" x:Name="contextMenu">
<MenuItem x:Name="menuItem1" Visibility="{Binding somebinding}" />
<MenuItem x:Name="menuItem2" Visibliity="{Binding somebinding}" />
</ContextMenu>
<DataTemplate.Trigger>
<Trigger SourceName="menuItem1" Propert"Visibility" Value="Visible">
<Setter TargetName="contextMenu" Property="Visibility" Value="Visible" />
</Trigger>
<Trigger SourceName="menuItem2" Propert"Visibility" Value="Visible">
<Setter TargetName="contextMenu" Property="Visibility" Value="Visible" />
</Trigger>
</DataTemplate.Trigger>
</DataTemplate>
我的问题是,这实际上取决于拥有此上下文菜单的控件(在本例中是 DataTemplate)。我们实际上想让这个上下文菜单行为独立,并将它放在一个资源中,以便其他控件可以与之共享。
我试图在上下文菜单本身的样式触发器中执行此操作,但在样式触发器中我不能使用目标名称和源名称。
谁能帮我想一个更好的解决方案?谢谢。
S.
更新:
查看 Nikolay 链接中的示例,我实现了一个转换器,如下所示
<ContextMenu x:Name="contextMenu" Visibility={Binding PATH=Items, Converter={StaticResource Converter}>
<MenuItem x:Name="menuItem1" Visibility="{Binding somebinding}" />
<MenuItem x:Name="menuItem2" Visibliity="{Binding somebinding}" />
</ContextMenu>
在转换器中,它检查每个菜单项的可见性并设置上下文菜单的适当可见性值。
但我发现的问题是 WPF 从上到下评估绑定,因此首先评估 ContextMenu,然后评估 MenuItem,在这种情况下,我的转换器不起作用,因为在绑定时,Items 仍然是 None .
各位有什么建议吗?
【问题讨论】:
-
不完全是,请看我的评论,与帖子相比,我没有使用ItemSource,我可以在WAML中构建这样的ItemCollection吗?
标签: wpf xaml user-interface contextmenu