WPF – 如果命令的CanExecute为false,如何隐藏菜单项?

默认情况下,菜单项在其命令无法执行(CanExecute = false)时被禁用。 基于CanExecute方法使菜单项可见/折叠的最简单方法是什么?

谢谢

为了方便您的解决scheme:使用“布尔到可见性”转换器将可见性属性绑定到IsEnabled属性。

您可以简单地将Visibility绑定到IsEnabled(在CanExecute == false上设置为false)。 你仍然需要一个IValueConverter来将bool转换为visible / collapsed。

public class BooleanToCollapsedVisibilityConverter : IValueConverter { #region IValueConverter Members public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { //reverse conversion (false=>Visible, true=>collapsed) on any given parameter bool input = (null == parameter) ? (bool)value : !((bool)value); return (input) ? Visibility.Visible : Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion } 

感谢您的解决scheme。 对于那些想要明确的XAML,这可能会有所帮助:

 <Window.Resources> <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" /> </Window.Resources> <ContextMenu x:Key="innerResultsContextMenu"> <MenuItem Header="Open" Command="{x:Static local:Commands.AccountOpened}" CommandParameter="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" CommandTarget="{Binding Path=PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" Visibility="{Binding Path=IsEnabled, RelativeSource={RelativeSource Self}, Mode=OneWay, Converter={StaticResource booleanToVisibilityConverter}}" /> </ContextMenu> 

在我的情况下,上下文菜单是一个资源,所以可见性绑定必须使用RelativeSource自绑定设置。

作为一个方面,对于CommandParameter,您也可以传递被点击的项目的DataContext来打开上下文菜单。 而且为了将命令绑定路由到父窗口,还需要相应地设置CommandTarget。

 <Style.Triggers> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Visibility" Value="Collapsed"/> </Trigger> </Style.Triggers> 

CanExecute切换IsEnabled属性,所以只要看看这个,并保持在UI中的一切。 如果您想重复使用,请创build一个单独的样式。

我不知道这是否是最简单的方法,但是您可以始终创build一个返回CanExecute()属性,然后使用IValueConverter将布尔值转换为Visibility,从而将元素的可见性绑定到此属性。