2011-01-28 7 views
18

mam przycisk:WPF Binding: wartość

<Button Content="Stop loading" /> 

W ViewModel mam właściwości IsLoaded. Nie chcę pisać własności IsNotLoaded, ale chcę użyć IsLoaded w bindowaniu i wyłączaniu przycisku, gdy IsLoaded = true.

Jak zaimplementować coś takiego:

<Button Content="Stop loading" IsEnabled="{Binding !IsLoaded}" /> 

PS: jeśli będzie to trudniejsze niż pisanie dodatkowej własności, użyję własności IsNotLoaded.

+2

Zobacz [to pytanie SO] (http://stackoverflow.com/questions/1039636/how-to-bind-inverse-boolean-properties-in-wpf) – Nekresh

Odpowiedz

11

Podczas odpowiedzi converter są ważne, można zajrzeć do alternatywnej metodologii: komendanta.

W WPF (i nieco w Silverlight) można powiązać polecenie ICommand z tym przyciskiem. Tak więc, jeśli tworzone, na ViewModel, właściwość o nazwie CancelLoadingCommand że wdrożone ICommand, to by powiązać przycisk następująco:

<Button Content="Stop Loading" Command="{Binding CancelLoadingCommand}" /> 

Realizacja CancelLoadingCommand w ViewModel będzie wyglądać mniej więcej tak:

public ICommand CancelLoadingCommand 
    { 
     get 
     { 
      if (_cancelLoadingCommand== null) 
      { 
       this._cancelLoadingCommand= new RelayCommand(
        delegate 
        { 
         // Cancel the loading process. 
        }, 
        delegate 
        { 
         return !this.IsLoaded; 
        } 
       ); 
      } 

      return _cancelLoadingCommand; 
     } 
    } 

Uwaga, używam tutaj polecenia RelayCommand (który jest częścią frameworka PRISM lub MVVM-Light). Proponuję również zajrzeć do jednego z nich.

Mam nadzieję, że to pomoże.

22

Standardowym sposobem wykonania tej czynności jest utworzenie wartości IValueConverter, która odwróci wartości boolowskie. Podczas tworzenia tej klasy jest trudniejsze niż dodanie nowej właściwości, to jest całkowicie wielokrotnego użytku - więc później, można ponownie użyć tego w innych powiązaniach (bez zanieczyszczania ViewModel z dużą ilością! Właściwości nieruchomości).

Ta klasa będzie wyglądać następująco:

[ValueConversion(typeof(bool), typeof(bool))] 
public class InvertBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool booleanValue = (bool)value; 
     return !booleanValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool booleanValue = (bool)value; 
     return !booleanValue; 
    } 
} 

Następnie należy dodać go do swoich zasobów:

<src:InvertBoolConverter x:Key="invertBoolConverter"/> 

Gdy masz to, by go używać jak:

<Button Content="Stop loading" 
     IsEnabled="{Binding IsLoaded, Converter={StaticResource invertBoolConverter}}" 
/> 
7

Jednym z rozwiązań jest użycie konwertera do odwrócenia wartości boolowskiej. Coś jak

public class InvertedBoolenConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return !(bool)value; 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return !(bool)value; 
    } 
} 

Następnie dodać konwerter do zasobu gdzieś i używać go w wiązaniu:

<YourUserControl.Resources> 
    <c:InvertedBoolenConverter x:Key="InvertedBoolenConverter" /> 
</YourUserControl.Resources> 

<Button Content="Stop loading" IsEnabled="{Binding IsLoaded,Converter={StaticResource InvertedBoolenConverter}}" /> 
6

Chcesz użyć konwertera. Oto ten, który załatwi sprawę za Ciebie.

public class booleaninverter : IValueConverter 
    { 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return !(bool)value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return !(bool)value; 
    } 
    } 

Aby go użyć, napisać XAML jak tak

<Button Content="Stop loading" IsEnabled="{Binding IsLoaded, Converter={StaticResource booleaninverter}" /> 

Można dokonać zasobu statyczną w App.xaml lub innych zasobów sekcja okna/kontroli. Oczywiście musisz wykonać "lokalne" deklaracje przestrzeni nazw i nie, ale to jest większość pracy wykonanej dla ciebie.

<local:booleaninverter x:key="booleaninverter"/> 
Powiązane problemy