Просто интересно, что люди считают лучшей практикой при реализации IValueConverter, который не имеет значимой реализации ConvertBack (или такой, который должен использоваться только как OneWay)?
Если он выбрасывает (и в этом случае какое исключение), вернуть null или вернуть какое-то значение по умолчанию.
Мысли?





Документация для IValueConverter.ConvertBack рекомендует возвращать DependencyProperty.UnsetValue.
The data binding engine does not catch exceptions that are thrown by a user-supplied converter. Any exception that is thrown by the ConvertBack method, or any uncaught exceptions that are thrown by methods that the ConvertBack method calls, are treated as run-time errors. Handle anticipated problems by returning DependencyProperty.UnsetValue.
По словам Microsoft, вы должны вернуть DependencyProperty.UnsetValue
Когда ConvertBack не содержит функциональных возможностей, а вы не ожидая, он должен быть вызван, выбросить NotImplementedException. Он не должен был вызываться, и поэтому вам нужно исключение времени выполнения.
Если ConvertBack вызывает намеренно, вам лучше предоставить для него реализацию. Один из вариантов - просто вернуть DependencyProperty.UnsetValue или обработать исключения в вашей реализации ConvertBack, вернув DependencyProperty.UnsetValue.
Мое оправдание для этого было бы: возвращение DependencyProperty.UnsetValue вместо выброса NotImplementedException делает его неочевидный, когда вызывается метод ConvertBack, когда вы действительно никогда не планировали этого. Возможно, он должен иметь некоторую функциональность теперь, когда он вызывается и генерирует исключение времени выполнения. Было бы намного сложнее обнаружить недостающую функциональность ConvertBack, если бы он просто возвращал DependencyProperty.UnsetValue.
Я согласен с ответом @Todd White.
Кроме того, чтобы сэкономить время, вы можете реализовать базовый класс преобразователя, который реализует ConvertBack для вас, поэтому вам не нужно реализовывать его каждый раз, сохраняя дублирующийся код.
Технически вам также не нужно переопределять Convert; Но это должно быть реализовано в ConverterBase, поскольку он реализует все методы интерфейса IValueConverter. На практике вы будете игнорировать Convert каждый раз, а ConvertBack большую часть времени можно игнорировать.
public class ConverterBase : IValueConverter
{
public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}
public class VisibilityConverter : ConverterBase
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value ^ (parameter as bool? == true)).ToVisibility();
}
}
Если вы собираетесь это сделать, вы должны использовать
NotSupportedException,NotImplementedExceptionпредназначен для функций, которые в настоящее время не реализованы, но будут.