В приложении 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);
}
}