way two tutorial que espaƱol data context wpf data-binding

two - WPF Property Data binding para negar la propiedad



wpf binding types (4)

¿Hay alguna manera 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.

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

NOTA: sin usar ValueConverter


No puede vincularse 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 debería darte 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.


Puede escribir un ValueConverter que niega automáticamente el impulso antes de devolverlo. Eche un vistazo al blog de BenCon para una breve lectura sobre los convertidores de valor.


Si específicamente desea hacer esto en XAML final (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) Usando IValueConverter 2) escriba una extensión XAML Markup (demasiado trabajar para esta pequeña tarea :))

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


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

Luego configuraría su enlace como:

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

Agregue un recurso (generalmente en su UserControl / Window) como sigue:

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

Edite en respuesta al comentario:

Si desea evitar un conversor de valor por algún motivo (aunque creo que es el lugar más adecuado), puede realizar la conversión directamente en su ViewModel. Simplemente agregue una propiedad como:

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

Sin embargo, si haces esto, asegúrate de que tu setter de propiedades IsAdmin también IsAdmin un evento PropertyChanged para "IsRegularUser" así como también "IsAdmin", por lo que la UI se actualiza en consecuencia.