Associare la visibilità di un pulsante a un valore bool in ViewModel

Come bind la visibilità di un pulsante a un valore bool nel mio ViewModel?

Supponendo che AdvancedFormat sia un bool , devi dichiarare e utilizzare un BooleanToVisibilityConverter :

     

Nota il Converter={StaticResource BoolToVis} aggiunto Converter={StaticResource BoolToVis} .

Questo è uno schema molto comune quando si lavora con MVVM. In teoria si può fare la conversione da soli sulla proprietà ViewModel (cioè basta rendere la proprietà stessa di tipo Visibility ) anche se preferirei non farlo, dato che ora si sta scherzando con la separazione delle preoccupazioni. La visibilità di un object dovrebbe davvero essere all’altezza della vista.

C’è un terzo modo che non richiede un convertitore o una modifica al tuo modello di visualizzazione: usa uno stile:

  

Tendo a preferire questa tecnica perché la utilizzo in molti casi in cui ciò a cui leggo non è booleano, ad esempio la visualizzazione di un elemento solo se il suo DataContext non è nullo o l’implementazione di schermi multi-stato in cui vengono visualizzati diversi layout in base a l’impostazione di un enum nel modello di vista.

Conversione a 2 vie in c # da booleano a visibilità

 using System; using System.Windows; using System.Windows.Data; namespace FaceTheWall.converters { class BooleanToVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value is Boolean && (bool)value) { return Visibility.Visible; } return Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value is Visibility && (Visibility)value == Visibility.Visible) { return true; } return false; } } } 

Generalmente ci sono due modi per farlo, una class del convertitore o una proprietà nel Viewmodel che converte essenzialmente il valore per te.

Tendo ad usare l’approccio property se si tratta di una conversione una tantum. Se vuoi riutilizzarlo, usa il convertitore. Sotto, trova un esempio del convertitore:

  _ Public Class BoolToVisibilityConverter Implements IValueConverter Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert If value IsNot Nothing Then If value = True Then Return Visibility.Visible Else Return Visibility.Collapsed End If Else Return Visibility.Collapsed End If End Function Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack Throw New NotImplementedException End Function End Class 

Un metodo di proprietà ViewModel dovrebbe semplicemente controllare il valore della proprietà booleana e restituire una visibilità basata su tale. Assicurati di implementare INotifyPropertyChanged e chiamalo su entrambe le proprietà Boolean e Visibility per aggiornarlo correttamente.

In vista:

  

In vista Modello:

 public _advancedFormat = Visibility.visible (whatever you start with) public Visibility AdvancedFormat { get{return _advancedFormat;} set{ _advancedFormat = value; //raise property changed here } 

Avrai bisogno di avere un evento cambiato proprietà

  protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) { PropertyChanged.Raise(this, e); } protected void OnPropertyChanged(string propertyName) { OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } 

Ecco come usano Model-view-viewmodel

Ma dal momento che vuoi legarlo a un booleano, avrai bisogno di un convertitore. Un altro modo è impostare un booleano all’esterno e quando viene cliccato quel pulsante, quindi impostare property_advancedFormat sulla visibilità desiderata.

Questo può essere ottenuto in un modo molto semplice 1. Scrivilo nella vista.

  

  1. La seguente è la proprietà booleana che contiene il valore vero / falso. Quello che segue è lo snippet di codice. Nel mio esempio questa proprietà è in class UserNote.

     public bool _isHide = false; public bool IsHide { get { return _isHide; } set { _isHide = value; OnPropertyChanged("IsHide"); } } 
  2. Questo è il modo in cui la proprietà IsHide ottiene il valore.

     userNote.IsHide = userNote.IsNoteDeleted;