WPF用户控件上下文菜单可见性绑定

6

我的用户控件上下文菜单的可见性无法绑定依赖属性。有什么想法吗?

以下是我的WPF代码:

<UserControl.ContextMenu>
    <ContextMenu Visibility="{Binding ElementName=wellControl, Path=IsInCompactMode, Converter={StaticResource BooleanToVisibilityConverter}}">
    <MenuItem Command="local:GCommands.Edit" />
    <MenuItem Command="local:GCommands.Delete" />
    <MenuItem Command="local:GCommands.ExportFcsFiles" />
    <MenuItem Command="local:GCommands.BatchExportStatistics" />
    <Separator/>
    <MenuItem Command="local:GCommands.SaveAs" Header="Save As..." />
    </ContextMenu>
</UserControl.ContextMenu>

如果我将Visibility =“Hidden”设置为“true”,它对我有用。就像这样:

<ContextMenu Visibility="Hidden"/>

如果使用此方法,它将无法工作。
<ContextMenu Visibility="{Binding ElementName=wellControl, Path=IsInCompactMode, Converter={StaticResource BooleanToVisibilityConverter}}">

我非常确定 Visibility="{Binding ElementName=wellControl, Path=IsInCompactMode, Converter={StaticResource BooleanToVisibilityConverter}}" 没有问题,因为它对其他人也有效。

这是我的依赖属性:

public bool IsInCompactMode
        {
            get {return (bool)GetValue(IsInCompactModeProperty); }
            set {SetValue(IsInCompactModeProperty, value); }
        }
        public static readonly DependencyProperty IsInCompactModeProperty =
            DependencyProperty.Register("IsInCompactMode", typeof(bool), typeof(WellControl), new PropertyMetadata(false));

我尝试了这种方式,看起来它仍然不起作用,这真的很奇怪!!!
<ContextMenu x:Name="menu" IsOpen="{Binding ElementName=wellControl, Path=IsInCompactMode}"> 

我真的很困惑,出了什么问题?“Binding ElementName = wellControl,Path = IsInCompactMode”对于用户控件的其他部分有效,只是对于奇怪的上下文菜单无效吗?这毫无意义。


1
为什么不行?发生了什么事?你想做什么? - SLaks
1
凭借这样的信息量,没人能够帮得了你。 - Dennis
抱歉各位,我是用手机发布的,无法添加更多信息。 - CodingTT
3个回答

14

1>ContextMenu、Popups和DataGridColumns不属于可视化树的一部分。因此,使用ElementNameRelativeSource进行绑定并不会像那样起作用。

2>当您希望上下文菜单在特定情况下不显示时,请使用触发器从可视化元素中取消上下文菜单。

      <TextBlock Text="ContextMenu is not shown when DataContext.IsShow is false"}">
            <TextBlock.Style>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="ContextMenu"
                            Value="{StaticResource TextBlockContextMenu}" />
                   <Style.Triggers>
                       <DataTrigger Binding="{Binding IsShow}"
                                    Value="False">
                            <Setter Property="ContextMenu"
                                    Value="{x:Null}" />
                       </DataTrigger>   
                   </Style.Triggers>
                </Style>
            </TextBlock.Style>
      </TextBlock>

为了使绑定工作,我们使用代理元素方法将这些项附加到可视树上...

MVVM绑定DataGrid列可见性

我更喜欢第二步骤。


1
如果您想要显示/隐藏上下文菜单,应该使用ContextMenuIsOpen属性,而不是Visibility属性。

但是这种方式仍然无法工作:<ContextMenu x:Name="menu" IsOpen="{Binding ElementName=wellControl, Path=IsInCompactMode}"> - CodingTT

-1

你应该添加更新触发器:"UpdateSourceTrigger=PropertyChanged"

<DataGrid.ContextMenu >
    <ContextMenu Visibility="{Binding IsSelectionEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,Converter={StaticResource BooleanToVisibilityConverter}}" >
        <ContextMenu.Items>
            <MenuItem Header="Create Layer" Command="{Binding DefineLayerName }" />
        </ContextMenu.Items>
    </ContextMenu>
</DataGrid.ContextMenu>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接