2010-04-05 13 views
20

¿Hay alguna forma de cambiar el valor de la propiedad en tiempo de ejecución en el enlace de datos WPF? Digamos que mi TextBox está vinculado a una propiedad IsAdmin. ¿De todos modos puedo cambiar el valor de la propiedad en XAML para que sea! IsAdmin.WPF Propiedad Enlace de datos para anular la propiedad

¡Solo quiero negar la propiedad para que Valueconverter sea una exageración!

NOTA: Sin utilizar ValueConverter

Respuesta

32

Puede usar un IValueConverter.

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

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

Entonces será la configuración de su unión como:

<TextBlock Text="{Binding Path=IsAdmin, Converter={StaticResource boolConvert}}" /> 

Añadir un recurso (por lo general en el control de usuario/ventana), así:

<local:InvertBooleanConverter x:Key="boolConvert"/> 

Editar en respuesta para comentar:

Si quieres evite un convertidor de valor por algún motivo (aunque creo que es el lugar más apropiado), puede realizar la conversión directamente en su ViewModel. Sólo tiene que añadir una propiedad como:

public bool IsRegularUser 
{ 
    get { return !this.IsAdmin; } 
} 

Si lo hace, sin embargo, asegúrese de que su IsAdmin colocador propiedad también provoca un evento PropertyChanged para "IsRegularUser", así como "IsAdmin", por lo que la interfaz de usuario se actualiza en consecuencia.

+0

En realidad debería haber mencionado sin utilizar ValueConverter – azamsharp

+6

¿No crees que es demasiado trabajo para una simple operación de negación! – azamsharp

+8

@azamsharp: He editado para darle otra opción, pero no, no, principalmente porque es un código ** reutilizable. Una vez que crea el convertidor, puede usarlo para TODAS sus conversiones de! Bool, en cualquier parte de su base de código. –

0

Puede escribir un ValueConverter que niega automáticamente el inpurt antes de devolverlo. Eche un vistazo a BenCon's blog para leer brevemente los convertidores de valores.

2

Si desea específicamente hacer esto en XAML end (no estoy seguro de la razón para eso, a menos que tenga 100s de operación similar de negate) solo hay dos maneras 1) Usar IValueConverter 2) escribir una extensión de marcado XAML (Demasiado trabajo para esta pequeña tarea :))

Luego, la otra forma obvia es escribir otra propiedad en su ViewModel, que puede devolver el valor Negativo de la propiedad IsAdmin.

0

No se puede vincular a! Property, pero podría crear un nuevo enlace con un IValueConverter apropiado y cambiar todo el enlace en tiempo de ejecución. La clave es la clase BindingOperations, que le permite cambiar el enlace en una DependencyProperty en particular.

public static void InvertBinding(DependencyObject target, DependencyProperty dp) 
    { 
     //We'll invert the existing binding, so need to find it 
     var binding = BindingOperations.GetBinding(target, dp); 
     if (binding != null) 
     { 
      if (binding.Converter != null) 
       throw new InvalidOperationException("This binding already has a converter and cannot be inverted"); 
      binding.Converter = new InvertingValueConverter(); //This would be your custom converter 

      //Not sure if you need this step, but it will cause the binding to refresh 
      BindingOperations.SetBinding(target, dp, binding); 
     } 
    } 

Esto debe darle una idea general; No utilizaría esto para el código de producción, ya que probablemente quiera generalizarlo para alternar el convertidor o cualquier otra cosa que necesite cambiar en el tiempo de ejecución. También podría evitar cambiar por completo el enlace creando una nueva propiedad a la que se vincule que encapsule esta lógica de 'conmutación'. La última opción es probablemente la mejor.

Cuestiones relacionadas