2010-09-21 14 views
42

Per impostazione predefinita le voci di menu diventano disabilitate quando il comando non può essere eseguito (CanExecute = false). Qual è il modo più semplice per rendere visibile/compressa la voce di menu in base al metodo CanExecute?WPF - come nascondere la voce di menu se il comando CanExecute è falso?

Grazie

per la vostra convenienza ecco la soluzione: associare la proprietà visibilità alla proprietà IsEnabled con convertitore "booleana per visibilità".

+1

Ohhhh - così semplice! Trucco eccellente! – sergtk

risposta

40

È possibile associare semplicemente Visibility a IsEnabled (impostato su false su CanExecute == false). Avresti ancora bisogno di un IValueConverter per convertire il bool in visibile/compresso.

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! Ovviamente. Molte grazie. –

+3

Questo è un po 'più del necessario basta un trigger – rjarmstrong

1

Non so se questo è il modo più semplice, ma è sempre possibile creare una proprietà che restituisce il CanExecute() e quindi associare la visibilità del tuo elemento a questa proprietà, utilizzando un IValueConverter per convertire il valore booleano in Visibilità.

+0

Questa risposta non aiuta molto, ma sto dando +1 per livellare quei punti negativi che non ho completamente capito perché qualcuno ha dato. Anche se questa risposta non è molto utile, TUTTE le cose menzionate in esso sono VALIDE e inoltre, tutte le altre risposte con un punteggio positivo USANO le cose menzionate. Il valore minimo che questa risposta merita è zero, non negativi! – quetzalcoatl

+0

Questo era il mio pensiero iniziale, ma come si otterrebbe l'accesso al parametro (parametro oggetto) all'interno di questa nuova proprietà e lo si passa a CanExecute()? – Matt

43

Grazie per la soluzione. Per coloro che desiderano XAML esplicito Questo potrebbe aiutare:

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

Nel mio caso, il menu di scelta rapida è una risorsa, in modo che il legame per la visibilità deve utilizzare l'impostazione RelativeSource Sé vincolante.

Come lato, per il CommandParameter, è anche possibile passare il DataContext dell'elemento su cui si è fatto clic per aprire il menu di scelta rapida. E per instradare i collegamenti dei comandi alla finestra principale, sarà necessario impostare anche il CommandTarget di conseguenza.

+0

Great Answer esattamente ciò di cui avevo bisogno – Gilad

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

CanExecute alterna la proprietà IsEnabled quindi basta guardare questo e tenere tutto nell'interfaccia utente. Crea uno stile separato se vuoi riutilizzarlo.

+0

Questo è perfetto - ha funzionato come un fascino (anche se ho usato un binding diretto con un convertitore bool to visibility invece di un trigger, il l'idea è la stessa) –

+1

+1 Questa è la soluzione migliore! E dovrebbe avere il segno di spunta verde – GETah

+7

La visibilità dovrebbe essere impostata su 'Collapsed' perché altrimenti la voce di menu nascosta occuperà ancora spazio. –

Problemi correlati