2010-11-02 1 views
7

Есть ли способ изменить поведение привязок по умолчанию, поэтому мне не нужно устанавливать «UpdateSourceTrigger = PropertyChanged» для каждого, в моем случае, текстового поля?Есть ли способ глобально изменить поведение по умолчанию привязок в wpf?

Возможно ли это с помощью элемента управления или стиля?

ответ

6

Может быть, это больше подходит для переопределения значения по умолчанию для переплетов, вы можете использовать эту для этой цели:

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

Тогда можно определить некоторую CustomBinding класс (установку соответствующих значений по умолчанию в конструкторе) и MarkupExtension 'CustomBindingExtension'. Затем замените привязки в вашем XAML что-то вроде этого:

Text = «{CustomBinding Path = Х ...}»

Я успешно попробовал что-то подобное с переплетом, который устанавливает определенным значения по умолчанию для ValidatesOnDataError и NotifyOnValidationError, должны работать и в вашем случае. Вопрос в том, что вам удобно заменять все ваши привязки, но вы можете автоматизировать эту задачу.

1

No. Такое поведение обрабатывается DefaultUpdateSourceTrigger из FrameworkPropertyMetadata класса, который передается при регистрации DependencyProperty. Это можно переопределить в унаследованном классе TextBox и за привязку, но не для каждого TextBox в приложении.

+0

Я попробую это решение ant спасибо за информацию. – Cinaird

-1

Как Pieter предложил я решить ее с унаследованным классом, как это:

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

и этот 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; 
     } 

Любые предложения, как решить эту проблему лучше?

+0

'DependencyProperty.OverrideMetadata()' - лучшая стратегия. Вы можете использовать это с помощью 'TextProperty', например' TextBox.TextProperty.OverrideMetadata (typeof (ActiveTextBox), << properties >>) '. –

+0

Что-то вроде этого ?: var defaultMetadata = TextProperty.GetMetadata (typeof (TextBox)); TextProperty.OverrideMetadata (TypeOf (ActiveTextBox), новые FrameworkPropertyMetadata ( string.Empty, FrameworkPropertyMetadataOptions.Journal | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, defaultMetadata.PropertyChangedCallback, defaultMetadata.CoerceValueCallback, правда, System.Windows.Data.UpdateSourceTrigger.PropertyChanged)); – Cinaird

Смежные вопросы