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

WPF ValueConverter - стандартный возврат для неконвертируемого значения

В течение прошлого года или около того я видел много разных преобразователей ценности для самых разных целей, от многих разных авторов. Одна вещь, которая возникает в моем сознании, - это широкая дисперсия значений "по умолчанию", возвращаемых ими. Например:

  public class MyConverter: IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      // OK, we test for some undesirable, unconvertable situation, typically null...
      if (value == null)
      {
        // And here are a variety of 'defaults' that I have seen, these begin the most typical.
        return null;
        return DependencyProperty.UnsetValue;
        return Binding.DoNothing;
      }
        //...... other code.. whatever...
}}

Итак, мой вопрос: существует ли "стандартный" способ указать, что входное значение не может быть преобразовано?

4b9b3361

Ответ 1

После долгих размышлений и копания, кажется, что DependencyProperty.UnsetValue является подходящим выбором. Я с большим успехом переместил все в дом на этот шаблон. Кроме того, текст в разделе "Замечания" этой страницы указывает, что я, вероятно, лучший выбор.

Также обсуждается вопрос о возврате входного значения, если привязка не может быть преобразована, но это может легко "разбить" систему привязки. Подумайте о случае, когда ввод привязки является "строкой", а выход - "кистью". Возврат строки не сработает!

Ответ 2

Согласно MSDN - IValueConverter:

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

Ключевая строка Обработка ожидаемых проблем путем возврата DependencyProperty.UnsetValue.

Ответ 3

Когда вы посмотрите эти значения, вы узнаете, что они означают. Затем выберите правильный, чтобы вернуться в конвертер.

Основная проблема заключается в том, что null может быть допустимым значением для свойства.

DependencyProperty.UnsetValue, чтобы указать, что свойство существует, но не имеет его значения, заданного системой свойств

Binding.DoNothing, чтобы указать механизму привязки не передавать значение цели привязки, а не переходить к следующему Binding в PriorityBinding, или не использовать значение FallBackValue или значение по умолчанию

ИЗМЕНИТЬ

Чтобы указать, что вы не можете преобразовать значение, вы должны просто вернуть данное значение. Это лучшее, что вы можете сделать, потому что оно возвращает проблему автору привязки. Если вы вмешиваетесь со значением, становится очень сложно узнать, что происходит.

Ответ 4

то, что вы возвращаете как значение по умолчанию, зависит от ситуации. Вы не хотите возвращать int по умолчанию для конвертера в bool или возвращать bool для конвертера для перечисления видимости.

Ответ 5

Обычно, если значение не может быть преобразовано, я бросаю Exception

Это потому, что если я пытаюсь преобразовать значение с использованием недопустимого конвертера, я хотел бы получить уведомление об этом, чтобы изменить свой код.

В некоторых редких случаях значение может быть действительным, даже если оно не может быть преобразовано, и в этом случае я обычно возвращаю то же значение, которое было передано конвертеру. Это используется только в том случае, если я хочу, чтобы значение было преобразовано, если это возможно, или остаться неизменным, если нет.

Еще один редкий случай, который я делал иногда, - hardcoding значение по умолчанию. Обычно это делается, когда я знаю, что Конвертер может использоваться с недопустимым параметром, и я хочу вернуть допустимое значение независимо от результата. Мои жестко закодированные преобразователи по умолчанию почти всегда возвращают логические значения.

Я не думаю, что когда-либо возвращал какой-либо из указанных вами 3 (null, DependencyProperty.UnsetValue или Binding.DoNothing), потому что эти значения часто бывают неожиданными и не просто заметить, если вы их специально не ищете.