Vinculando la visibilidad de un Botón a un valor bool en ViewModel

¿Cómo puedo vincular la visibilidad de un botón a un valor bool en mi ViewModel?

Suponiendo que AdvancedFormat es un bool , necesita declarar y usar BooleanToVisibilityConverter :

     

Tenga en cuenta el Converter={StaticResource BoolToVis} agregado Converter={StaticResource BoolToVis} .

Este es un patrón muy común cuando se trabaja con MVVM. En teoría, usted podría hacer la conversión usted mismo en la propiedad ViewModel (es decir, simplemente haga que la propiedad en sí misma sea de tipo Visibility ) aunque preferiría no hacerlo, ya que ahora está jugando con la separación de preocupaciones. La visibilidad de un elemento debería corresponder a la Vista.

Hay una tercera forma que no requiere un convertidor o un cambio en su modelo de vista: use un estilo:

   

Tiendo a preferir esta técnica porque la utilizo en muchos casos en los que lo que estoy vinculando no es booleano; por ejemplo, mostrar un elemento solo si DataContext no es nulo, o implementar pantallas de múltiples estados donde aparecen diferentes diseños basados ​​en el ajuste de una enumeración en el modelo de vista.

Conversión de 2 vías en c # de booleano a visibilidad

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

En general, hay dos maneras de hacerlo, una clase de convertidor o una propiedad en el modelo de vista que esencialmente convierte el valor para usted.

Tiendo a utilizar el enfoque de propiedad si se trata de una conversión única. Si quiere reutilizarlo, use el convertidor. A continuación, encuentra un ejemplo del convertidor:

  _ 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 método de propiedad ViewModel simplemente verificaría el valor de la propiedad booleana y devolvería una visibilidad basada en eso. Asegúrese de implementar INotifyPropertyChanged y llámelo en las propiedades Boolean y Visibility para actualizarlo correctamente.

En vista:

  

En vista Modelo:

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

Deberá tener un evento cambiado propiedad

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

Así es como usan Model-view-viewmodel

Pero como quiere que esté vinculado a un booleano, necesitará un convertidor. Otra forma es establecer un booleano afuera y cuando se hace clic en ese botón, configure el property_advancedFormat con la visibilidad deseada.

Esto se puede lograr de una manera muy simple 1. Escribe esto en la vista.

  

  1. La siguiente es la propiedad booleana que contiene el valor verdadero / falso. El siguiente es el fragmento de código. En mi ejemplo, esta propiedad está en la clase UserNote.

     public bool _isHide = false; public bool IsHide { get { return _isHide; } set { _isHide = value; OnPropertyChanged("IsHide"); } } 
  2. Esta es la forma en que la propiedad IsHide obtiene el valor.

     userNote.IsHide = userNote.IsNoteDeleted;