Ошибка проверки WPF сохраняется до тех пор, пока элемент управления не потеряет фокус - PullRequest
0 голосов
/ 26 мая 2019

У меня есть текстовое поле, в которое я добавил правило проверки в xaml. Правило работает и выявляет ошибки, но только после того, как пользователь выделит какой-то другой элемент в окне, например, другое текстовое поле.

Это определение:

<TextBox x:Name="textBoxLongitude" Grid.Row="1" Grid.Column="1" Margin="0,0,0,10" VerticalContentAlignment="Center">
        <TextBox.Text>
            <Binding Path="CustomerLongitude">
                <Binding.ValidationRules>
                    <local:IsDoubleValidationRule MaxValue ="180"/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

Я попытался решить проблему, добавив это в xaml текстового поля:

TextChanged="textBoxTextChanged"

И реализация:

private void textBoxTextChanged(object sender, TextChangedEventArgs e)
{
     CommandManager.InvalidateRequerySuggested();
}

Это не помогло ..

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

1 Ответ

0 голосов
/ 26 мая 2019

Установите UpdateSourceTrigger привязки на PropertyChanged, чтобы зафиксировать и заново оценить связанное значение при каждом изменении вместо LostFocus.

Привязки, которые являются TwoWay или OneWayToSource, прослушивают изменения в целевом свойстве и распространяют их обратно к источнику. Это известно как обновление источника. Обычно эти обновления происходят всякий раз, когда целевое свойство изменяется. Это хорошо для флажков и других простых элементов управления, но обычно не подходит для текстовых полей. Обновление после каждого нажатия клавиши может снизить производительность и лишает пользователя обычной возможности вернуться назад и исправить ошибки ввода перед принятием нового значения. Поэтому значением свойства UpdateSourceTrigger по умолчанию для свойства Text является LostFocus, а не PropertyChanged.

Вот как это сделать: <Binding Path="CustomerLongitude" UpdateSourceTrigger="PropertyChanged">

...