Подтвердить что ты не робот

Лучшая практика, когда не внедряйте IValueConvert.ConvertBack

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

Должен ли он выбрасывать (и в этом случае какое исключение), возвращать null или возвращать некоторое значение по умолчанию.

Мысли?

4b9b3361

Ответ 1

Документация MSDN для IValueConverter.ConvertBack рекомендует вернуться DependencyProperty.UnsetValue.

Механизм привязки данных не ломается исключения, которые пользовательский преобразователь. Любое исключение который выбрасывается ConvertBack метод или любые неперехваченные исключения которые выбрасываются методами, которые Вызов метода ConvertBack обрабатываются как ошибки времени выполнения. Обработать ожидаемые проблемы путем возвращения DependencyProperty.UnsetValue.

Ответ 2

Согласно Microsoft, вы должны вернуть DependencyProperty.UnsetValue

Ответ 3

Когда ConvertBack не содержит никаких функций, и вы не ожидаете, чтобы его вызывать, выкиньте NotImplementedException. Он не должен был быть вызван и, следовательно, вам нужно исключение времени выполнения.

Если ConvertBack ConvertBack называется намеренно, тогда вам лучше обеспечить реализацию для него. Один из вариантов - просто вернуть DependencyProperty.UnsetValue или обрабатывать исключения в рамках реализации ConvertBack, возвращая DependencyProperty.UnsetValue.

Моим оправданием для этого было бы: возврат DependencyProperty.UnsetValue вместо того, чтобы бросать исключение NotImplementedException, делает его неочевидным, когда вызывается метод ConvertBack, когда вы этого никогда не делали. Возможно, теперь он должен иметь некоторую функциональность, когда он вызывается и генерирует исключение времени выполнения. Было бы гораздо труднее обнаружить недостающую функциональность ConvertBack, если она просто возвращает DependencyProperty.UnsetValue.

Ответ 4

Я согласен с ответом @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();
    }
}