53 votes

WPF - comment masquer l'élément de menu si CanExecute de la commande est faux?

Par défaut, les éléments de menu sont désactivés lorsque sa commande ne peut pas être exécutée (CanExecute = false). Quelle est la façon la plus simple de rendre l'élément de menu visible / réduit en fonction de la méthode CanExecute?

Merci

pour votre commodité, voici la solution: liez la propriété de visibilité à la propriété IsEnabled à l'aide du convertisseur "Boolean to Visibility".

53voto

Reddog Points 7462

Merci pour la solution. Pour ceux qui veulent du XAML explicite, cela pourrait aider:

 <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>
 

Dans mon cas, le menu contextuel est une ressource, donc la liaison pour la visibilité doit utiliser la configuration de liaison RelativeSource Self.

Comme côté, pour le CommandParameter, vous pouvez également passer le DataContext de l'élément sur lequel vous avez cliqué pour ouvrir le menu contextuel. Et pour acheminer les liaisons de commandes vers la fenêtre parente, vous devrez également définir le CommandTarget en conséquence.

48voto

rjarmstrong Points 390
 <Style.Triggers>
    <Trigger Property="IsEnabled" Value="False">
        <Setter Property="Visibility" Value="Hidden"/>
    </Trigger>
</Style.Triggers>
 

CanExecute bascule la propriété IsEnabled, alors surveillez cela et conservez tout dans l'interface utilisateur, créez un style distinct si vous souhaitez le réutiliser.

44voto

MrDosu Points 2572

Vous pouvez simplement lier Visibility à IsEnabled (défini sur false sur CanExecute == false). Vous auriez toujours besoin d'un IValueConverter pour convertir le booléen en visible / réduit.

     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
    }
 

8voto

Jacob Foshee Points 1022

1voto

Roel Points 3768

Je ne sais pas si c'est le moyen le plus simple, mais vous pouvez toujours créer une propriété qui renvoie le CanExecute() , puis lier la visibilité de votre élément à cette propriété, en utilisant un IValueConverter pour convertir le booléen en visibilité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X