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.