Есть ли способ глобально изменить поведение привязок по умолчанию в wpf?
Есть ли способ изменить поведение привязок по умолчанию, поэтому мне не нужно устанавливать UpdateSourceTrigger=PropertyChanged для каждого, в моем случае, текстового поля?
Может ли это быть сделано с помощью ControlTemplate или Style?
3 ответа
Может быть, лучше переопределить значения по умолчанию для ваших привязок, вы можете использовать это для этой цели:
http://www.hardcodet.net/2008/04/wpf-custom-binding-class
Затем вы определяете некоторый класс CustomBinding (устанавливая соответствующие значения по умолчанию в конструкторе) и MarkupExtension 'CustomBindingExtension'. Затем замените привязки в вашем XAML чем-то вроде этого:
Text = "{CustomBinding Path = Xy...}"
Я успешно пробовал нечто подобное с привязкой, которая устанавливает определенные значения по умолчанию для ValidatesOnDataError и NotifyOnValidationError, должна работать и в вашем случае. Вопрос в том, можете ли вы заменить все свои привязки, но вы можете автоматизировать эту задачу.
Нет. Это поведение обрабатывается DefaultUpdateSourceTrigger
из FrameworkPropertyMetadata
класс, который передается при регистрации DependencyProperty
, Это можно переопределить в унаследованном классе TextBox
и в обязательном порядке, но не для каждого TextBox
в приложении.
Как предложил Питер, я решил это с помощью унаследованного класса, например:
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);
}
}
}
и этот метод помощи:
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;
}
Любое предложение, как решить это лучше?