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();
Другие вопросы по тегам