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

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

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

Мысли?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
36
0
7 014
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Документация для 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.

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

Lukazoid 20.07.2012 14:50

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

Другие вопросы по теме