variable true flag false example con bool c# wpf xaml data-binding

c# - true - Vinculando la visibilidad de un Botón a un valor bool en ViewModel



if con boolean en c# (6)

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

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

<Button Height="50" Width="50" Style="{StaticResource MyButtonStyle}" Command="{Binding SmallDisp}" CommandParameter="{Binding}" Cursor="Hand" Visibility="{Binding Path=AdvancedFormat}" />


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:

<ValueConversion(GetType(Boolean), GetType(Visibility))> _ 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:

<Button Height="50" Width="50" Style="{StaticResource MyButtonStyle}" Command="{Binding SmallDisp}" CommandParameter="{Binding}" Cursor="Hand" Visibility="{Binding Path=AdvancedFormat}"/>

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.

<Button HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Height="30"> <Button.Style> <Style TargetType="Button"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding IsHide}" Value="True"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style> </Button.Style>

  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;


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

<Style TargetType="Button"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding IsVisible}" Value="True"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style>

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.


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

<!-- In your resources section of the XAML --> <BooleanToVisibilityConverter x:Key="BoolToVis" /> <!-- In your Button declaration --> <Button Height="50" Width="50" Style="{StaticResource MyButtonStyle}" Command="{Binding SmallDisp}" CommandParameter="{Binding}" Cursor="Hand" Visibility="{Binding Path=AdvancedFormat, Converter={StaticResource BoolToVis}}"/>

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 puede hacer la conversión usted mismo en la propiedad ViewModel (es decir, solo haga que la propiedad 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.