2011-01-28 8 views
18

tengo botón:WPF Encuadernación: valor

<Button Content="Stop loading" /> 

En ViewModel i tienen la propiedad IsLoaded. No quiero escribir la propiedad IsNotLoaded, pero quiero usar IsLoaded en el botón de vinculación y deshabilitación cuando IsLoaded = true.

Cómo implementar algo como esto:

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

P. S. si es más difícil que escribir sobre propiedades adicionales, usaré la propiedad IsNotLoaded.

+2

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

Respuesta

11

Si bien las respuestas del convertidor son todas válidas, es posible que desee consultar una metodología alternativa: Commanding.

En WPF (y algo en Silverlight), puede vincular un ICommand a ese botón. Por lo tanto, si ha creado, en su modelo de vista, una propiedad llamada CancelLoadingCommand que implementó ICommand, que había unen el botón de la siguiente manera:

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

La aplicación de la CancelLoadingCommand en su modelo de vista sería algo como:

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

      return _cancelLoadingCommand; 
     } 
    } 

Nota, estoy usando un RelayCommand aquí (que es parte de los frameworks PRISM o MVVM-Light). Sugeriría investigar uno de esos también.

Espero que esto ayude.

22

El medio estándar para hacer esto es crear un IValueConverter que invierta sus valores booleanos. Si bien la creación de esta clase es más difícil que agregar una nueva propiedad, es completamente reutilizable, por lo que luego puede reutilizarla en otras vinculaciones (¡sin contaminar su ViewModel con muchas propiedades!).

Esta clase sería algo como:

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

A continuación, deberá añadir a sus recursos:

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

Una vez que tienes esto, que lo utilizarían como:

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

Una solución es usar un convertidor para invertir el valor booleano. Algo así como

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

A continuación, añadir el convertidor a un recurso en algún lugar y lo utilizan en la unión:

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

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

que desea utilizar un convertidor. Aquí hay uno que hará el truco para ti.

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

Para utilizarlo, escriba su xaml al igual que

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

Puede hacer que el recurso estático en su App.xaml, o sección otros recursos de la ventana/de control. Por supuesto, debe hacer las declaraciones de espacio de nombres 'locales' y lo que no, pero esto es la mayor parte del trabajo hecho para usted.

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