Явная привязка UpdateSource() не работает, пока мышь не наведется на TextBox

Итак, я вызываю метод UpdateSource() для свойства Text TextBox в коде позади. Должен появиться ErrorTemplate, но этого не произойдет, пока я не наведу указатель мыши на TextBox.

Или, может быть, он есть, но не перекрашивается? Любые идеи, как исправить это, чтобы мгновенно обновить графический интерфейс?

РЕДАКТИРОВАТЬ:

Это свойство изменено. Проблема не в обновлении источника. Проблема в том, что когда исходный код обновляется, он вызывает проверку, и должен появиться ErrorTemplate, но этого не происходит, пока я не наведу указатель мыши на проверенный TextBox.

РЕДАКТИРОВАТЬ:

По-видимому, он обновляется, когда я также навожу мышь на некоторые другие элементы графического интерфейса (например, переключатель), что не имеет ничего общего с проверкой. Это определенно проблема перерисовки или привязки триггера проверки ошибок проверки. Как я могу вызвать это в коде позади?


person Martynas    schedule 01.02.2012    source источник
comment
Текстовое поле становится красным перед наведением мыши? Это поведение ErrorTemplate по умолчанию. Возможно, вы сможете получить желаемое поведение с помощью ControlTemplate.   -  person paparazzo    schedule 01.02.2012
comment
Нет, это не так. ErrorTemplate срабатывает только при наведении курсора мыши. Это проблема. Однако он отлично работает во всех других ситуациях.   -  person Martynas    schedule 01.02.2012
comment
Реализует ли источник iNotifyPropertyChanged? Отследите Get и посмотрите, когда он вызывается. Возможно, вам придется вручную сбросить ошибку.   -  person paparazzo    schedule 01.02.2012
comment
Да бывает, дело не в этом. Ошибка выдается в Set. UpdateSource() обновляет его недопустимым значением, и создается исключение, которое должно открыть ErrorTemplate. Однако он открывает ErrorTemplate только тогда, когда я навожу указатель мыши на какой-либо элемент графического интерфейса. Наведение мыши не достигает точки останова ни в Get, ни в Set.   -  person Martynas    schedule 01.02.2012
comment
Извините, я больше ничем не помог. Смотрите мое последнее предположение, опубликованное как ответ только для комнаты. Не то чтобы я говорил вам что-то, чего вы еще не поняли, но это событие ErrorTemplate, похоже, вызывается TextBox, когда оно имеет фокус и проверяет наличие ошибок. У вас есть ValidatesOnExceptions=True и NotifyOnValidationError=True?   -  person paparazzo    schedule 01.02.2012
comment
Эти свойства также не соответствуют действительности.   -  person Martynas    schedule 01.02.2012


Ответы (2)


Возможно, вы сможете заставить Validation_Error сработать.

    <TextBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" x:Name="fieldValue" BorderBrush="SteelBlue" BorderThickness="2" TextWrapping="Wrap" 
             Text="{Binding Path=DF.FieldValue, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True, UpdateSourceTrigger=Explicit}"
             Validation.Error="Validataion_Error"
             LostFocus="fieldValue_LostFocus"  KeyUp="fieldValue_KeyUp"/>


    private void Validataion_Error(object sender, ValidationErrorEventArgs e)
    {
        if (e.Action == ValidationErrorEventAction.Added)
        {
            MessageBox.Show(e.Error.ErrorContent.ToString(), "Fatal Update Error");
        }
    }

Возможно, поскольку это событие находится в TextBox, оно срабатывает только тогда, когда TextBox имеет фокус. Возможно, вам придется создать собственное событие и обработать его на странице/окне.

person paparazzo    schedule 01.02.2012
comment
Теперь это странно. Когда я заставляю его выводить окно сообщения, он обновляет графический интерфейс. Тот же эффект, как если бы я навел курсор на любой элемент WPF. Я думаю, мне нужно будет использовать какой-то уродливый хак здесь. Любые идеи, что будет работать? - person Martynas; 01.02.2012
comment
Вместо MessageBox попробуйте установить фокус на TextBox. - person paparazzo; 01.02.2012
comment
В моем конкретном сценарии я не могу его сфокусировать (фокус вызывает побочный эффект). Любые другие идеи? - person Martynas; 01.02.2012
comment
Хорошо, спасибо за вашу помощь, но это не совсем то, что я ищу. Я уверен, что есть способ добиться того же поведения, что и окно сообщения. Ревалидация или что-то в этом роде. - person Martynas; 01.02.2012
comment
Проблема решена. Мне помогло: immortalratblog.blogspot. ком/2008/04/ - person Martynas; 03.02.2012

Привязка к свойству Text элемента управления TextBox довольно специфична. UpdateSourceTrigger по умолчанию имеет значение «LostFocus». Это для повышения производительности. Попробуйте изменить его на PropertyChanged.

person RredCat    schedule 01.02.2012
comment
Извините, что недостаточно ясно объяснил. Пожалуйста, проверьте обновленный вопрос. - person Martynas; 01.02.2012