2010-09-21 23 views
42

Par défaut, les éléments de menu sont désactivés lorsque leur 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 en fonction de la méthode CanExecute?WPF - comment cacher l'élément de menu si la commande CanExecute est fausse?

Merci

pour votre commodité, voici la solution: Liez la propriété de visibilité à la propriété en utilisant IsEnabled convertisseur « Boolean à la visibilité ».

+1

Ohhhh - si simple! Excellent tour! – sergtk

Répondre

40

Vous pouvez simplement lier la visibilité à IsEnabled (définie sur false sur CanExecute == false). Vous auriez toujours besoin d'un IValueConverter pour convertir le bool en visible/effondré.

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

Duh! Bien sûr. Merci beaucoup. –

+3

Ceci est un peu plus d'effort que nécessaire, vous pouvez simplement utiliser un déclencheur – rjarmstrong

1

Je ne sais pas si cela est le moyen le plus facile, mais vous pouvez toujours créer une propriété qui retourne la CanExecute() et lie ensuite la visibilité de votre élément à cette propriété, en utilisant un IValueConverter pour convertir la valeur booléenne Visibilité.

+0

Cette réponse n'aide pas beaucoup, mais je lui donne +1 pour niveler les points négatifs que je ne comprends pas complètement pourquoi quelqu'un a donné. Bien que cette réponse ne soit pas trop utile, TOUTES les choses qui y sont mentionnées sont VALIDES et, de plus, toutes les autres réponses positives utilisent les choses mentionnées. Le moins de point que cette réponse mérite est zéro, pas de négatif! – quetzalcoatl

+0

C'était ma première pensée, mais comment auriez-vous accès au paramètre (object param) depuis cette nouvelle propriété, et passez-le à CanExecute()? – Matt

43

Merci pour la solution. Pour ceux qui veulent 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, de sorte que la liaison pour la visibilité doit utiliser la configuration de liaison RelativeSource auto. En tant que côté, pour le paramètre CommandParameter, vous pouvez également transmettre le DataContext de l'élément sur lequel vous avez cliqué pour ouvrir le menu contextuel. Et afin d'acheminer les liaisons de commande à la fenêtre parente, vous devrez également définir CommandTarget en conséquence.

+0

Grande Réponse exactement ce dont j'avais besoin – Gilad

40
<Style.Triggers> 
    <Trigger Property="IsEnabled" Value="False"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
    </Trigger> 
</Style.Triggers> 

CanExecute la propriété permet de basculer IsEnabled donc juste regarder cela et tout garder à l'interface utilisateur. Créez un style séparé si vous souhaitez réutiliser ceci.

+0

Ceci est parfait - travaillé comme un charme (bien que j'ai utilisé une liaison directe avec un bool au convertisseur de visibilité au lieu d'un déclencheur, le l'idée est la même) –

+1

+1 C'est la meilleure solution! Et devrait avoir la coche verte – GETah

+7

La visibilité devrait être réglée sur 'Collapsed', sinon l'élément de menu caché occupera encore de l'espace. –