【问题标题】:WPF UserControl Context Menu Visibility BindingWPF UserControl 上下文菜单可见性绑定
【发布时间】:2011-12-08 13:51:01
【问题描述】:

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

这是我的 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" 它将对我有用。 像这样:

<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”适用于用户控件的其他部分,只是不适用于奇怪的上下文菜单?没有意义

【问题讨论】:

  • 为什么不呢?发生什么了?你想做什么?
  • 有了这么多的信息,没人能帮助你……
  • 抱歉各位,我是用手机发的,无法添加更多信息。

标签: wpf user-controls contextmenu


【解决方案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>

【讨论】:

    【解决方案2】:

    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>
    

    3> 要将这些项目附加到可视化树,以便绑定起作用,我们使用代理元素方法...

    Bind datagrid column visibility MVVM

    我更喜欢第二步。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 但是这种方式还是不行
      猜你喜欢
      • 2012-05-23
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      相关资源
      最近更新 更多