2010-11-02 11 views

Respuesta

6

Tal vez sea más adecuado para anular los valores predeterminados para sus enlaces, usted podría utilizar éste para tal fin:

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

A continuación, defina una clase customBinding (configuración de ajustes apropiados en el constructor) y una MarkupExtension 'CustomBindingExtension'. luego vuelva a colocar los enlaces en su XAML por algo como esto:

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

He tratado con éxito algo similar con una unión que se establece ciertos los valores predeterminados para ValidatesOnDataError y NotifyOnValidationError, también deberían funcionar en su caso. La pregunta es si se siente cómodo reemplazando todas sus fijaciones, pero podría automatizar esta tarea.

1

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

+0

Voy a probar esa solución y gracias por la información. – Cinaird

-1

Como Pieter propuso lo resolví con una clase heredada de esta manera:

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 esto helpmethod:

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

Cualquier sugerencia de cómo resolver mejor?

+0

'DependencyProperty.OverrideMetadata()' es una mejor estrategia. Puede usar esto con 'TextProperty' como' TextBox.TextProperty.OverrideMetadata (typeof (ActiveTextBox), << properties >>) '. –

+0

¿Algo como esto ?: var defaultMetadata = TextProperty.GetMetadata (typeof (TextBox)); TextProperty.OverrideMetadata (typeof (ActiveTextBox), nuevos FrameworkPropertyMetadata ( String.Empty, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, defaultMetadata.PropertyChangedCallback, defaultMetadata.CoerceValueCallback, cierto, System.Windows.Data.UpdateSourceTrigger.PropertyChanged)); – Cinaird

Cuestiones relacionadas