WPF-как скрыть пункт меню, если CanExecute команды false?

по умолчанию пункты меню отключаются, когда его команда не может быть выполнена (CanExecute = false). Каков самый простой способ сделать элемент меню видимым / свернутым на основе метода CanExecute?

спасибо

для вашего удобства вот решение: привязать свойство visibility к свойству IsEnabled с помощью преобразователя" Boolean to Visibility".

5 ответов


вы можете просто привязать видимость к IsEnabled (установите значение false на CanExecute == false). Вам все равно понадобится IValueConverter для преобразования bool в видимый/свернутый.

    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
    }

Спасибо за решение. Для тех, кто хочет явного 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 свойство так что просто смотреть это и держать все в пользовательском интерфейсе. Создайте отдельный стиль, если хотите использовать его повторно.


Microsoft предоставляет BooleanToVisibilityConverter.
http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter.aspx


Я не знаю, если это самый простой способ, но вы всегда можете создать свойство, которое возвращает CanExecute() а затем привязать видимость вашего элемента к этому свойству, используя IValueConverter чтобы преобразовать логическое значение в видимость.