2011-01-28 20 views
18

Düğmem var:WPF Bağlama:! Değeri

<Button Content="Stop loading" /> 

ViewModel'de IsLoaded özelliği var. IsNotLoaded özelliği yazmak istemiyorum ama IsLoaded = true olduğunda Bağlan ve Bağlan düğmesinde IsLoaded kullanmak istiyorum.

Böyle bir şeyi nasıl uygularsınız:

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

S.S. Ek özellik yazmayı zorlaştırırsa, IsNotLoaded özelliğini kullanacağım.

+2

[Bu SO sorusu] konusuna bakın (http://stackoverflow.com/questions/1039636/how-to-bind-inverse-boolean-properties-in-wpf) – Nekresh

cevap

11

Dönüştürücü yanıtlarının tümü geçerli olsa da, alternatif bir yönteme bakmak isteyebilirsiniz: Komut.

WPF'de (ve bir şekilde Silverlight'ta), bu düğmeye bir ICommand bağlayabilirsiniz.

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

sizin ViewModel CancelLoadingCommand uygulanması bakmak bir şey gibi:

aşağıdaki gibi Yani, yaratılan bile, ViewModel üzerinde, iCommand uygulanan bir özellik olarak adlandırılan CancelLoadingCommand, düğmeyi bağlamak istiyorum
public ICommand CancelLoadingCommand 
    { 
     get 
     { 
      if (_cancelLoadingCommand== null) 
      { 
       this._cancelLoadingCommand= new RelayCommand(
        delegate 
        { 
         // Cancel the loading process. 
        }, 
        delegate 
        { 
         return !this.IsLoaded; 
        } 
       ); 
      } 

      return _cancelLoadingCommand; 
     } 
    } 

Not: Burada bir RelayCommand kullanıyorum (PRISM veya MVVM-Light çerçevelerinin bir parçasıdır). Bunlardan birine bakmayı öneririm.

Umarım bu yardımcı olur.

22

Bunu yapmanın standart yolu, boole değerlerinizi tersine çevirecek bir IValueConverter yapmaktır. Bu sınıfı oluştururken yeni bir özellik eklemekten daha zordur, tamamen yeniden kullanılabilir - daha sonra bunu başka bağlamalarda (ViewModel'ınızı çok fazla! Mülk özellikleriyle kirletmeden) yeniden kullanabilirsiniz.

Bu sınıf gibi görünecektir: Sonra

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

, kendi kaynaklarına eklersiniz:

<Button Content="Stop loading" 
     IsEnabled="{Binding IsLoaded, Converter={StaticResource invertBoolConverter}}" 
/> 
: Bu edindikten sonra

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

, hoşuna kullanırsınız

7

Bir çözüm, boole değerini ters çevirmek için bir dönüştürücü kullanmaktır.

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

gibi bir şey Sonra bağlayıcı bir yerde bir kaynağa dönüştürücü eklemek ve kullanmak:

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

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

Bir dönüştürücü kullanmak istiyorum. İşte sana hile yapacak olan.

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

Sen App.xaml statik kaynak yapmak veya başka pencere/kontrol kaynakları bölümü, size kullanabilirsiniz böylece

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

gibi xaml yazmak için. Tabii ki 'yerel' ad alanı bildirimlerini ve neyi yapmamalısınız, ama bu sizin için yapılan işlerin çoğu.

<local:booleaninverter x:key="booleaninverter"/>