将上下文菜单的可见性设置为 Hidden/Collapsed 时出现空白上下文菜单

Blank Context menu appearing when Setting Visibility of context menu to Hidden/Collapsed

我想不显示上下文菜单,或者在上下文菜单中显示一个或两个项目。我正在使用 MVVM 模式。

我已经尝试将上下文菜单可见性链接到布尔值 属性,这似乎有效,但是在当前控件后面呈现一个空的上下文菜单,并且在当前控件关闭后变得可见。我试过添加绑定到相同 属性 的数据触发器 - 但它不会被触发。检查可视化树显示默认 属性 设置为上下文菜单。

MenuItem 可见性工作正常,因此我可以显示 1 或 2 个项目。但是当不需要上下文菜单时,

后面会出现一个空白菜单

注意:可见性隐藏或折叠的结果相同

上下文菜单作为静态资源绑定到 DataGrid:

  RowStyle="{StaticResource PagedGridRowStyle}"
       <ContextMenu x:Key="BlankMenu" Visibility="Hidden">
        </ContextMenu>
        <ContextMenu x:Key="PagedGridMenu"
                     Visibility="{Binding Path=DataContext.ContextMenuEnabled, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource VisConverter}}"
                     DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
            <MenuItem Header="{Binding Path=DataContext.MenuActionName1, RelativeSource={RelativeSource AncestorType=UserControl}}"
                      Visibility="{Binding Path=DataContext.ContextMenuEnabled, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource VisConverter}}"
                      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DataContext}"
                      Command="{Binding Path=DataContext.MenuActionCommand1, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
            <MenuItem Header="{Binding Path=DataContext.MenuActionName2, RelativeSource={RelativeSource AncestorType=UserControl}}"
                      Visibility="{Binding Path=DataContext.ContextMenu2Enabled, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource VisConverter}}"
                      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DataContext}"
                      Command="{Binding Path=DataContext.MenuActionCommand2, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
        </ContextMenu>
        <Style x:Key="PagedGridRowStyle"
               TargetType="{x:Type DataGridRow}">
            <Setter Property="ContextMenu"
                    Value="{StaticResource PagedGridMenu}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ContextMenuEnabled}" Value="false">
                    <Setter Property="ContextMenu" Value="{StaticResource BlankMenu}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>

注意 VisConverter 只是在布尔值

上切换 Visibility.Visible 和 Visibility.Collapsed

Style.Triggers - 以上: 这是替换完整上下文菜单的尝试 - 试图避免在控件后面打开空白上下文菜单。 - 但它没有被解雇。

       private bool _contextMenu2Enabled;
        public bool ContextMenu2Enabled
        {
            get => _contextMenu2Enabled;
            set
            {
                _contextMenu2Enabled = value;
                OnPropertyChanged();
            }
        }

        private bool _contextMenuEnabled;
        public bool ContextMenuEnabled
        {
            get => _contextMenuEnabled;
            set
            {
                _contextMenuEnabled = value;
                OnPropertyChanged();
            }
        }

绑定错误:

当 ContextMenuEnabled = false 时:(和 ContextMenu2Enabled = false)

System.Windows.Data Error: 40 : BindingExpression path error: 'ContextMenuEnabled' property not found on 'object' ''DataRowView' (HashCode=33440573)'. BindingExpression:Path=ContextMenuEnabled; DataItem='DataRowView' (HashCode=33440573); target element is 'DataGridRow' (Name=''); target property is 'NoTarget' (type 'Object')

上下文菜单不出现,但在数据网格后面呈现一个空的上下文菜单,并在数据网格关闭后可见

当 ContextMenuEnabled = true(和 ContextMenu2Enabled = false) 相同的 BindingExpression 错误 - 但上下文菜单按预期显示单个项目。

当 ContextMenuEnabled = true 且 ContextMenu2Enabled = true 相同的 BindingExpression 错误,- 但两个上下文菜单项均按预期显示。

您可以在 setter:

中将 ContextMenu 属性 设置为 null,而不是显示空的 ContextMenu
<Setter Property="ContextMenu" Value="{x:Null}"/>

并且如果 ContextMenuEnabled 属性 在您的视图模型中定义,您应该使用 RelativeSource 绑定到它:

Binding="{Binding DataContext.ContextMenuEnabled, 
   RelativeSource={RelativeSource AncestorType=UserControl}}"