将上下文菜单的可见性设置为 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}}"
我想不显示上下文菜单,或者在上下文菜单中显示一个或两个项目。我正在使用 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.CollapsedStyle.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}}"