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
чтобы преобразовать логическое значение в видимость.