ValidateWithoutUpdate никогда не выполняет настроенные ValidationRules?
Я пытаюсь понять, почему вызовы BindingExpression.ValidateWithoutUpdate() на самом деле не делают то, что он рекламирует.
У меня есть некоторая капризная проверка (я удалил скучные детали из моего примера кода; достаточно сказать, что это связано с ограничениями WF4 ModelItem), которые я должен добавить к привязке через присоединенное свойство (например, из кода а не в xaml).
// d is DependencyObject and prop is DependencyProperty
var binding = BindingOperations.GetBinding(d, prop);
binding.ValidationRules.Add(new MyDerpyValidatonRule());
Здесь нет ничего сумасшедшего. Но проблема в том, что проверка не запускается при первом показе элемента управления, поэтому ошибки проверки не отображаются в пользовательском интерфейсе.
<TextBox
Grid.Column="1"
x:Name="derp"
Text="{Binding Derp, NotifyOnValidationError=True,
ValidatesOnDataErrors=True}"
t:MyDerpyValidator.TargetProperty="{x:Static TextBox.TextProperty}" />
Привязка выглядит хорошо, работает после изменения значения, но при первом показе я получаю хмурое лицо вместо ожидаемой красной границы:
Сначала я попытался вызвать ValidateWithoutUpdate после того, как добавил ValidationRule в Binding. Это не похоже на работу. Позже я использовал Диспетчер, чтобы попытаться отложить этот вызов, пока приложение не стало теплым и уютным (возможно, оно не подтвердилось, потому что чай еще не закончился, черт возьми, я не знаю)
var exp = BindingOperations.GetBindingExpression(d, prop);
Dispatcher.CurrentDispatcher.BeginInvoke(
(Action<BindingExpression>)(x =>
{
x.ValidateWithoutUpdate();
}),
DispatcherPriority.ApplicationIdle,
exp);
Я почти уверен, что это сработало однажды. Однажды Никогда не работал снова. Возможно, это было неправильное наблюдение с моей стороны.
Позже я попробовал все, чтобы ValidateWithoutUpdate действительно что-то делал. Я даже пытался вызвать его из обработчика событий, который случится в будущем
public DerpyControl()
{
InitializeComponent();
derp.MouseEnter += DERPDAMNYOU;
}
void DERPDAMNYOU(object sender, MouseEventArgs e)
{
derp.GetBindingExpression(TextBox.TextProperty).ValidateWithoutUpdate();
}
Это никогда не работает.
Что мне нужно сделать, чтобы получить BindingExpression.ValidateWithoutUpdate() для проверки friggen?!?!
2 ответа
Вау, это странное поведение. Глядя на некоторый код проверки с помощью ILSpy, он имеет некоторые проверки в фоновом режиме, которые определяют, требуется ли проверка, или нет, и я был слишком напуган, чтобы выполнить ее полностью, поэтому я тоже просто попробовал некоторые случайные вещи.
Это первое, что я попробовал, чтобы это сработало:
В прикрепленном свойстве изменился обработчик, после
binding.ValidationRules.Add(new MyDerpyValidatonRule());
добавлять
BindingOperations.ClearBinding(d, prop);
BindingOperations.SetBinding(d, prop, binding);
Это должно как-то установить внутренний флаг 'validation requred', который заставляет его проверять.
Решение для моего проекта было:
var binding = BindingOperations.GetBindingExpression(textbox, TextBox.TextProperty);
binding.UpdateSource();
binding.ValidateWithoutUpdate();