Исключения привязки данных - PullRequest
0 голосов
/ 17 октября 2019

В приложении wpf у меня есть привязка данных: текстовое поле к int и двойное свойство с INPC.

Логика приложения должна использовать «PropertyChanged» в UpdateSourceTrigger. Также реализован интерфейс INotifyDataErrorInfo с атрибутами аннотаций данных.

Когда я очищаю текстовое поле, я вижу исключения привязки данных в окне вывода отладки.

System.Windows.Data Error: 7 : ConvertBack cannot convert value '' (type 'String'). BindingExpression:Path=Power; DataItem='Auto' (HashCode=64554036); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') FormatException:'System.FormatException: Input string has invalid format.
   at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
   at System.String.System.IConvertible.ToDouble(IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at MS.Internal.Data.SystemConvertConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
   at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

Я думаю, что это не хорошо.

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

Насколько важно избегать этих исключений?

Следует ли в этом случае переносить класс модели? Какова лучшая практика для этого случая?

Мой пример кода с этой проблемой.

<TextBox Text="{Binding Power, UpdateSourceTrigger=PropertyChanged}"/>
public class Auto : INotifyPropertyChanged
    {
        string _model;
        private double _power;
        private int _volume;

        public event PropertyChangedEventHandler PropertyChanged;

        private void Set<T>(ref T field, T value, [CallerMemberName]string propertyName = "")
        {
            if (EqualityComparer<T>.Default.Equals(field, value)) return;
            field = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public string Model
        {
            get => _model;
            set => Set(ref _model, value);
        }
        public double Power
        {
            get => _power;
            set => Set(ref _power, value);
        }
        public int Volume
        {
            get => _volume;
            set => Set(ref _volume, value);
        }
    }

1 Ответ

2 голосов
/ 18 октября 2019

Насколько важно избегать этих исключений?

Не важно, поскольку фреймворк уже обрабатывает их для вас.

Должно ли оно быть заключено вэто случай для класса модели?

Нет, не используйте string свойства для хранения значений int и double.

Что лучшеПрактика для этого случая?

Или игнорируйте ошибки привязки или реализуйте свои собственные конвертеры:

public class DoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!double.TryParse(value.ToString(), out double d))
            return Binding.DoNothing;
        return d;
    }
}

Использование:

<TextBox>
    <TextBox.Text>
        <Binding Path="Power" UpdateSourceTrigger="PropertyChanged">
            <Binding.Converter>
                <local:DoubleConverter />
            </Binding.Converter>
        </Binding>
    </TextBox.Text>
</TextBox>
...