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一个单独的样式。
微软提供了一个BooleanToVisibilityConverter。
http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter.aspx
我不知道这是否是最简单的方法,但是您可以始终创build一个返回CanExecute()
属性,然后使用IValueConverter
将布尔值转换为Visibility,从而将元素的可见性绑定到此属性。