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}" />
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.
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.
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;
}
}
}
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.
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.
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>
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");
}
}
Auf diese Weise erhält die Eigenschaft IsHide den Wert.
userNote.IsHide = userNote.IsNoteDeleted;