2015-05-11 2 views
6

ich ein View-Modell mit einer Eigenschaft erhalten habe:Wie man ein einfaches XAML (WPF) bedingte Bindung auf der Eigenschaft Sichtbarkeit tun

public class MyModel 
{ 
    public bool IsEnabled {get;set;} 
} 

Ich mag diese Eigenschaft verwenden, um eine Schaltfläche Zustand zu wechseln. Wenn der boolesche Wert wahr ist, möchte ich die Schaltfläche ausblenden und ansonsten anzeigen.

Ich habe versucht, Dinge wie:

<Button Visibility= "{Binding IsEnabled ? Hidden : Visible }">Enable</Button> 

Aber das passt nicht.

Ich habe eine etwas komplexere Lösung versucht, aber meine Vermutung ist, mir fehlt etwas Triviales.

Irgendwelche Vorschläge?

+2

Sie benötigen –

Antwort

13

Da Sie zwischen Hidden und Visible und wahr wechseln wollen versteckt Sie entweder benutzerdefinierte IValueConverter schreiben oder verwenden einfach Style.Trigger

<Button Content="Enable"> 
    <Button.Style> 
     <Style TargetType="{x:Type Button}"> 
      <Setter Property="Visibility" Value="Visible"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsEnabled}" Value="True"> 
        <Setter Property="Visibility" Value="Hidden"/> 
       </DataTrigger> 
      </Style.Triggers>      
     </Style> 
    </Button.Style> 
</Button> 
Diese

ist alles, vorausgesetzt, die DataContext entsprechend eingestellt und MyModel.IsEnabled hebt INotifyPropertyChanged.PropertyChanged Ereignis, wenn geändert

public class MyModel : INotifyPropertyChanged 
{ 
    private bool _isEnabled; 

    public bool IsEnabled 
    { 
     get { return _isEnabled; } 
     set 
     { 
      _isEnabled = value; 
      OnPropertyChanged("IsEnabled"); 
     } 
    } 

    #region INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion 
} 
+1

Das ist großartig, ich habe gelernt viel aus deiner Antwort. Ist der ' Stefan

+0

Es kommt darauf an. Manchmal ist die Beziehung zwischen Quelle und Ziel komplexer und Sie müssen entweder 'IValueConverter' oder 'IMultiValueConverter' schreiben, aber wenn Sie einen Wert haben, aus dem ganzen Bereich der Quelleigenschaftswerte, wenn etwas passieren sollte - in Ihrem Fall, wenn true, dann Versteckt - Es ist einfacher, 'DataTrigger' zu verwenden – dkozl

6

die BooleanToVisibilityConverter Verwendung:

<Window.Resources> 
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 
</Window.Resources> 

<Button Visibility= "{Binding IsEnabled, Converter={StaticResource BooleanToVisibilityConverter}}" /> 
+1

eine Bool, um die Sichtbarkeit Konverter hinzufügen Das ist nicht ganz gleich, weil BooleanToVisbilityConverter kehrt Komprimiert (nicht verborgen) für einen falschen Wert. Das OP hat den Booleschen auch geschaltet, also sollte true auf Hidden und false auf Visible setzen –

+0

Außerdem wäre True Visible und nicht Hidden/Collapsed – dkozl

+0

Und der OP muss auch INotifyPropertyChanged implementieren :) – Krishna

2

eine Klasse hinzufügen IValueConverter vererben

public class BooleanToVisibilityConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool bValue = (bool)value; 
     if (bValue) 
      return Visibility.Visible; 
     else 
      return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Visibility visibility = (Visibility)value; 

     if (visibility == Visibility.Visible) 
      return true; 
     else 
      return false; 
    } 
    #endregion 
} 
Verwandte Themen