首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定更改后弹出WPF上下文菜单

绑定更改后弹出WPF上下文菜单
EN

Stack Overflow用户
提问于 2017-01-11 22:57:12
回答 2查看 456关注 0票数 1

我在UserControl中有一个边框控件,它用作图形更改的开关。边框有一个带有两个MenuItems的上下文菜单:“打开”和“关闭”。

当开关关闭时,只有“打开”MenuItem可见,而当开关打开时,只有“关闭”可见。对于某些开关,我需要完全禁用Open或Close,所以我不希望它们在任何时候都可见。代码如下:

代码语言:javascript
复制
<Border.ContextMenu>
    <ContextMenu Name="switchContextMenu">
        <ContextMenu.Visibility>
            <MultiBinding Converter="{StaticResource ContextMenuBoolToVisibility}">
                <Binding Path="OpenAvailable" />
                <Binding Path="OpenVisible" />
                <Binding Path="CloseAvailable" />
                <Binding Path="CloseVisible" />
            </MultiBinding>
        </ContextMenu.Visibility>
        <MenuItem Name="miOpen" Header="{Binding Path=Resources.PowerControlSystem_OPEN, Source={StaticResource LocalizedStrings} }" 
                  Click="miOpen_Click">
            <MenuItem.Visibility>
                <MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}">
                    <Binding Path="OpenAvailable" />
                    <Binding Path="OpenVisible" />
                </MultiBinding>
            </MenuItem.Visibility>
        </MenuItem>
        <MenuItem Name="miClose" Header="{Binding Path=Resources.PowerControlSystem_CLOSE, Source={StaticResource LocalizedStrings} }" 
                  Click="miClose_Click">
            <MenuItem.Visibility>
                <MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}">
                    <Binding Path="CloseAvailable" />
                    <Binding Path="CloseVisible" />
                </MultiBinding>
            </MenuItem.Visibility>
        </MenuItem>
    </ContextMenu>
</Border.ContextMenu>

我将此开关用作通用组件,因此在另一个.xaml代码中设置了"Open Available“和"Close Available”属性。这就是我的问题:

我有一个开关,它的Open Available属性设置为False。默认情况下,此开关处于打开状态。我可以把它关了,这没问题。然后,当我再次右键单击此开关时,上下文菜单不可见。这也没问题。

问题是,当我更改某些值时,此开关再次打开,并且在该时间点上,弹出上下文菜单。我认为问题出在ContextMenu可见性的转换器中。它在此时被触发,并且ContextMenu变得可见。

有没有人知道如何阻止这种行为?

EN

回答 2

Stack Overflow用户

发布于 2017-01-11 23:07:56

您可以设置Border的样式,而不是设置ContextMenu可见性

代码语言:javascript
复制
<Border>
    <Border.Style>
        <Style TargetType="Border">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu Name="switchContextMenu">
                        <MenuItem Name="miOpen" Header="{Binding Path=Resources.PowerControlSystem_OPEN, Source={StaticResource LocalizedStrings} }" 
                            Click="miOpen_Click">
                            <MenuItem.Visibility>
                                <MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}">
                                    <Binding Path="OpenAvailable" />
                                    <Binding Path="OpenVisible" />
                                </MultiBinding>
                            </MenuItem.Visibility>
                        </MenuItem>
                        <MenuItem Name="miClose" Header="{Binding Path=Resources.PowerControlSystem_CLOSE, Source={StaticResource LocalizedStrings} }" 
                            Click="miClose_Click">
                            <MenuItem.Visibility>
                                <MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}">
                                    <Binding Path="CloseAvailable" />
                                    <Binding Path="CloseVisible" />
                                </MultiBinding>
                            </MenuItem.Visibility>
                        </MenuItem>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Value="False">
                    <DataTrigger.Binding>
                        <MultiBinding Converter="{StaticResource ContextMenuBoolAggregate}">
                            <Binding Path="OpenAvailable" />
                            <Binding Path="OpenVisible" />
                            <Binding Path="CloseAvailable" />
                            <Binding Path="CloseVisible" />
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter Property="ContextMenu" Value="{x:Null}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

因此,触发器会有条件地删除ContextMenu,而不是更改其可见性。我使用ContextMenuBoolAggregate转换器名称来表示您需要创建一个新的转换器来确定正确的值,以删除上下文菜单-我认为如何实现该部分很清楚。

如果您的条件足够简单,则可以在MultiBindingConverter中使用MultiDataTrigger而不是DataTrigger

代码语言:javascript
复制
<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding OpenAvailable}" Value="False"/>
        <Condition Binding="{Binding OpenVisible}" Value="False"/>
        <Condition Binding="{Binding CloseAvailable}" Value="False"/>
        <Condition Binding="{Binding CloseVisible}" Value="False"/>
    </MultiDataTrigger.Conditions>
    <Setter Property="ContextMenu" Value="{x:Null}"/>
</MultiDataTrigger>
票数 0
EN

Stack Overflow用户

发布于 2017-01-12 16:08:53

我用另一种方式找到了解决方案。我使用了ContextMenuService.IsEnabled属性。当设置为false时,无法显示上下文菜单。因此,我在我的Border.xaml代码中添加了以下内容:

代码语言:javascript
复制
<ContextMenuService.IsEnabled>
    <MultiBinding Converter="{StaticResource ContextMenuBoolToVisibility}">
        <Binding Path="OpenAvailable" ElementName="mySwitch" />
        <Binding Path="OpenVisible" ElementName="mySwitch" />
        <Binding Path="CloseAvailable" ElementName="mySwitch" />
        <Binding Path="CloseVisible" ElementName="mySwitch" />
    </MultiBinding>
</ContextMenuService.IsEnabled>

我还更改了我的ContextMenuBoolToVisibility转换器。现在为ContextMenuService.IsEnabled属性返回truefalse,而不是返回Visibility.VisibleVisibility.Collapsed

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41594048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档