Лучшая практика, когда не внедряется IValueConvert.ConvertBack - PullRequest
32 голосов
/ 05 ноября 2008

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

Если он сгенерирует (и в этом случае какое исключение), вернет ноль или вернет какое-то значение по умолчанию.

Мысли

Ответы [ 4 ]

44 голосов
/ 05 ноября 2008

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

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

8 голосов
/ 05 ноября 2008

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

3 голосов
/ 15 июня 2012

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

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

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

2 голосов
/ 11 августа 2016

Я согласен с ответом @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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...