【问题标题】:Can I implement such rule in the WPF context menu in XAML?我可以在 XAML 的 WPF 上下文菜单中实现这样的规则吗?
【发布时间】: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 .

各位有什么建议吗?

【问题讨论】:

标签: wpf xaml user-interface contextmenu


【解决方案1】:

看看下面的帖子,它会给你一些想法。在不同的控件上切换可见性,但方法是相似的。

Implementing "Rename" from a ContextMenu

【讨论】:

    【解决方案2】:

    使用转换器的解决方案不起作用,因为您将上下文菜单可见性绑定到项目,但项目集合在加载后不会更改,并且绑定不会被重新评估,然后子项目的可见性会更改。

    我看不到任何仅在 Xaml 中实现此目的的简单方法,但您可以使用代码轻松实现。例如,您可以从 ContextMenu 派生,在派生类中,您可以订阅所有子项的可见性更改(通过依赖属性更改通知)并相应地更改其可见性。

    仅在 xaml 中执行此操作的黑客方法 - 对 ContextMenu.Visibility 使用多重绑定并绑定到项目和您的 somebinding 但实际上只使用项目。这样,wpf 将在任何绑定更改时调用您的可见性转换器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-04
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 2011-12-19
      • 1970-01-01
      相关资源
      最近更新 更多