WPF – comment masquer un é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). Quel est le moyen le plus simple de rendre l’élément de menu visible / réduit selon 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”.

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

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

       

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

En ce qui concerne le CommandParameter, vous pouvez également transmettre le DataContext de l’élément sur lequel vous avez cliqué pour ouvrir le menu contextuel. Et pour acheminer les liaisons de commande vers la fenêtre parente, vous devez également définir le CommandTarget en conséquence.

      

CanExecute active CanExecute désactive la propriété IsEnabled , il suffit de regarder cela et de conserver tout dans l’interface utilisateur. Créez un style distinct si vous souhaitez le réutiliser.

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