c# wpf binding .net-4.0 updatesourcetrigger

c# - ¿Hay alguna manera de cambiar globalmente los comportamientos predeterminados de las vinculaciones en wpf?



binding .net-4.0 (3)

¿Hay alguna manera de cambiar el comportamiento predeterminado de los enlaces, por lo que no es necesario configurar ''UpdateSourceTrigger = PropertyChanged'' en cada uno, en mi caso, en el cuadro de texto?

¿Podría hacerse esto a través de ControlTemplate o Style?


No. Este comportamiento lo maneja DefaultUpdateSourceTrigger de la clase FrameworkPropertyMetadata , que se pasa al registrar una DependencyProperty . Es posible anular esto en una clase heredada de TextBox y por enlace, pero no para cada TextBox de TextBox en la aplicación.


Al igual que Pieter, propuse que lo resolví con una clase heredada como esta:

public class ActiveTextBox:TextBox { public ActiveTextBox() { Loaded += ActiveTextBox_Loaded; } void ActiveTextBox_Loaded(object sender, System.Windows.RoutedEventArgs e) { Binding myBinding = BindingOperations.GetBinding(this, TextProperty); if (myBinding != null && myBinding.UpdateSourceTrigger != UpdateSourceTrigger.PropertyChanged) { Binding bind = (Binding) Allkort3.Common.Extensions.Extensions.CloneProperties(myBinding); bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; BindingOperations.SetBinding(this, TextBox.TextProperty, bind); } } }

y este método de ayuda:

public static object CloneProperties(object o) { var type = o.GetType(); var clone = Activator.CreateInstance(type); foreach (var property in type.GetProperties()) { if (property.GetSetMethod() != null && property.GetValue(o, null) != null) property.SetValue(clone, property.GetValue(o, null), null); } return clone; }

¿Alguna sugerencia de cómo resolverlo mejor?


Tal vez sea más adecuado anular los valores predeterminados para sus Enlaces, puede usar este para ese propósito:

http://www.hardcodet.net/2008/04/wpf-custom-binding-class

A continuación, define alguna clase CustomBinding (estableciendo los valores predeterminados adecuados en el constructor) y una MarkupExtension ''CustomBindingExtension''. Luego reemplace los enlaces en su XAML por algo como esto:

Text = "{CustomBinding Path = Xy ...}"

He intentado con éxito algo similar con un enlace que establece ciertos valores predeterminados para ValidatesOnDataError y NotifyOnValidationError, también debería funcionar en su caso. La pregunta es si te sientes cómodo reemplazando todas tus ataduras, pero podrías automatizar esta tarea.