webentwicklung-frage-antwort-db.com.de

Binden der Sichtbarkeit eines Buttons an einen Bool-Wert in ViewModel

Wie binde ich die Sichtbarkeit einer Schaltfläche an einen bool-Wert in meinem ViewModel?

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

Angenommen, AdvancedFormat ist ein bool, müssen Sie ein BooleanToVisibilityConverter deklarieren und verwenden:

<!-- 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}}"/>

Beachten Sie das hinzugefügte Converter={StaticResource BoolToVis}.

Dies ist ein sehr häufiges Muster bei der Arbeit mit MVVM. Theoretisch könnten Sie die Konvertierung in der ViewModel-Eigenschaft selbst durchführen (dh Sie können die Eigenschaft selbst vom Typ Visibility erstellen), obwohl ich dies lieber nicht tun würde, da Sie dies jetzt tun mit der Trennung von Bedenken herumspielen. Die Sichtbarkeit eines Objekts sollte wirklich der Ansicht entsprechen.

188
dlev

Es gibt eine dritte Möglichkeit, die weder einen Konverter noch eine Änderung Ihres Ansichtsmodells erfordert: Verwenden Sie einen Stil:

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

Ich bevorzuge diese Technik, weil ich sie in vielen Fällen verwende, in denen meine Bindung nicht boolesch - z. Anzeigen eines Elements nur, wenn sein DataContext nicht null ist, oder Implementieren von Anzeigen mit mehreren Status, bei denen unterschiedliche Layouts basierend auf der Einstellung einer Enumeration im Ansichtsmodell angezeigt werden.

90
Robert Rossney

2-Wege-Konvertierung in c # von Boolean zu Visibility

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

Im Allgemeinen gibt es zwei Möglichkeiten, dies zu tun: eine Konvertierungsklasse oder eine Eigenschaft im Ansichtsmodell, die den Wert im Wesentlichen für Sie konvertiert.

Ich tendiere dazu, den Immobilienansatz zu verwenden, wenn es sich um eine einmalige Konvertierung handelt. Wenn Sie es wiederverwenden möchten, verwenden Sie den Konverter. Unten finden Sie ein Beispiel für den Konverter:

<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

Eine ViewModel-Eigenschaftsmethode überprüft lediglich den booleschen Eigenschaftswert und gibt darauf basierend eine Sichtbarkeit zurück. Stellen Sie sicher, dass INotifyPropertyChanged implementiert ist, und rufen Sie es in den Eigenschaften Boolean und Visibility auf, damit es ordnungsgemäß aktualisiert wird.

4
CodeWarrior

Im Hinblick auf:

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

In Ansicht Modell:

public _advancedFormat = Visibility.visible (whatever you start with)

public Visibility AdvancedFormat
{
 get{return _advancedFormat;}
 set{
   _advancedFormat = value;
   //raise property changed here
}

Sie müssen ein Ereignis mit geänderter Eigenschaft haben

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

    protected void OnPropertyChanged(string propertyName) 
    { 
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

So verwenden sie Model-view-viewmodel

Da Sie jedoch möchten, dass es an einen Booleschen Wert gebunden wird, benötigen Sie einen Konverter. Eine andere Möglichkeit besteht darin, einen Booleschen Wert außerhalb festzulegen. Wenn Sie auf diese Schaltfläche klicken, stellen Sie property_advancedFormat auf die gewünschte Sichtbarkeit ein.

3
Kevin

Dies kann auf sehr einfache Weise erreicht werden 1. Schreiben Sie dies in die Ansicht.

<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. Das Folgende ist die boolesche Eigenschaft, die den Wert true/false enthält. Das Folgende ist das Code-Snippet. In meinem Beispiel befindet sich diese Eigenschaft in der UserNote-Klasse.

    public bool _isHide = false;
    
    public bool IsHide
    {
    
    get { return _isHide; }
    
    set
        {
            _isHide = value;
                OnPropertyChanged("IsHide");
        }
    } 
    
  2. Auf diese Weise erhält die Eigenschaft IsHide den Wert.

    userNote.IsHide = userNote.IsNoteDeleted;
    
2
Joy Fernandes