WPF UserControl上下文菜单可见性绑定

时间:2011-10-16 02:21:53

标签: wpf user-controls contextmenu

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

这是我的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}"> 

我真的很困惑,怎么了? “绑定ElementName = wellControl,Path = IsInCompactMode”适用于用户控件的其他部分,只是不适用于奇怪的上下文菜单?它没有成功

3 个答案:

答案 0 :(得分:8)

1&GT; 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&GT;要将这些项附加到可视树中,以便绑定起作用,我们使用代理元素方法...

Bind datagrid column visibility MVVM

我更喜欢第二步。

答案 1 :(得分:0)

如果您要显示/隐藏上下文菜单,则应使用IsOpen的{​​{1}}属性,而不是ContextMenu属性。

答案 2 :(得分:-1)

您应该添加更新触发器:&#34; UpdateSourceTrigger = PropertyChanged&#34;

<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>