2010-11-02 7 views

risposta

6

Forse è più adatto da sovrascrivere le impostazioni predefinite per le associazioni, è possibile utilizzare questo uno per quello scopo:

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

Poi si definisce una classe customBinding (impostazione di default appropriate nel costruttore) e una MarkupExtension 'CustomBindingExtension'. quindi sostituire le associazioni nel vostro XAML da qualcosa di simile:

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

Ho provato con successo qualcosa di simile con un legame che pone dei i valori predefiniti per ValidatesOnDataError e NotifyOnValidationError, dovrebbero funzionare anche nel tuo caso. La domanda è se si ha familiarità con la sostituzione di tutte le associazioni, ma è possibile automatizzare questa attività.

1

No. Questo comportamento viene gestito dal DefaultUpdateSourceTrigger della classe FrameworkPropertyMetadata, che è passato al momento della registrazione di un DependencyProperty. È possibile sovrascriverlo in una classe ereditata di TextBox e per associazione, ma non per ogni TextBox nell'applicazione.

+0

Proverò la soluzione e grazie per le informazioni. – Cinaird

-1

come Pieter proposto ho risolto con una classe ereditata come questo:

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

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

Qualsiasi suggerimento come risolverlo meglio?

+0

'DependencyProperty.OverrideMetadata()' è una strategia migliore. Puoi usarlo con un 'TextProperty' come' TextBox.TextProperty.OverrideMetadata (typeof (ActiveTextBox), << properties >>) '. –

+0

Qualcosa del genere ?: var defaultMetadata = TextProperty.GetMetadata (typeof (TextBox)); TextProperty.OverrideMetadata (typeof (ActiveTextBox), nuovi FrameworkPropertyMetadata ( string.Empty, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, defaultMetadata.PropertyChangedCallback, defaultMetadata.CoerceValueCallback, vero, System.Windows.Data.UpdateSourceTrigger.PropertyChanged)); – Cinaird

Problemi correlati