Обработать исключение преобразования с помощью INotifyDataErrorInfo - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть текстовое поле в моем представлении, где пользователь может ввести значение порта TCP. Текстовое поле привязывается непосредственно к свойству Port модели (типа Int32), поскольку ViewModel предоставляет полную модель для привязки. Модель наследуется от ObservableObject, поэтому привязка к ней напрямую работает хорошо.

Я использую INotifyDataErrorInfo в моей модели, а свойство Port проверяет значение в установщике свойств (оно должно быть больше 0).

У меня есть кнопка в моем представлении, которая привязывается к методу HasError () модели и устанавливает его состояние IsEnabled на основе логического возвращаемого значения из HasError ()

Теперь к проблеме, если пользователь введет «Hello world», возникнет исключение, генерируемое механизмом привязки WPF. В таком случае установщик свойств никогда не выполняется, поэтому HasError () никогда не изменяется на true для такого неверного ввода.

Конечно, я мог бы установить «ValidatesOnExceptions = True» для текстового поля в представлении, чтобы хотя бы иметь текстовое поле для отображения своего шаблона ошибки проверки в этом случае, но все равно кнопка не будет отключена.

Вопрос, каково рекомендуемое решение, как обрабатывать эти случаи, когда автоматическое преобразование завершается неудачно, так что проверка ViewModel / Model никогда не выполняется?

Я бы согласился с решением, в котором проверка выполняется для строки текстового поля, а не для типа Int32, и выполняется до того, как механизм автоматического связывания WPF выполнит неудачное автоматическое преобразование типа в Int32.

Решение, которое я действительно хочу избежать, состоит в том, чтобы свойство ViewModel / Model всегда имело тип string, проверьте строку в установщике, а затем попытайтесь вручную привести ее к правильному типу (в данном случае Int32). Должно быть лучшее решение, избегающее всех таких ручных бросков.

При использовании ValidationRules можно указать механизму валидации выполнить ValidationRule перед автоматическим преобразованием. Что я действительно ищу, так это способ выполнить проверку INotifyDataErrorInfo также до того, как будет выполнено автоматическое приведение.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Свойство int не может быть установлено иначе, чем значение int. Когда вы пытаетесь установить для него «Hello world», механизм привязки перехватывает исключение и заботится об этом за вас.

Если вы хотите выполнить проверку самостоятельно или настроить сообщение об ошибке, вы можете определить пользовательское ValidationRule и установить для его свойства ValidationStep значение RawProposedValue, чтобы его можно было применить до преобразования значения:

public class StringToIntValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        int i;
        if (int.TryParse(value.ToString(), out i))
            return new ValidationResult(true, null);

        return new ValidationResult(false, "Please enter a valid integer value.");
    }
}

XAML:

<TextBox>
    <TextBox.Text>
        <Binding Path="Age" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:StringToIntValidationRule ValidationStep="RawProposedValue"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

Обратите внимание, что этот вид проверки или настройки не включает модель представления. Это фреймворк / просмотр / управление.

0 голосов
/ 13 сентября 2018

Трудности, с которыми вы сталкиваетесь, являются примером того, почему вы должны , а не быть привязанным непосредственно к вашей модели с вашей точки зрения. Весь смысл модели представления состоит в том, чтобы перевести вопросы представления назад и вперед между представлением и посредником, которые взаимодействуют с базовой моделью.

Например: если ваше представление предоставляет строку для порта, то модель представления проверит это и преобразует ее (если она действительна) в целое число для модели, либо уведомит представление о неверном вводе с помощью любого механизма уведомления об ошибках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...