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...
}}
Итак, мой вопрос, есть ли "стандартный" способ показать, что входное значение не может быть преобразовано?
6 ответов
по данным в MSDN - в разделе ivalueconverter:
механизм привязки данных не ловит исключения, которые генерируются пользовательский конвертер. Любое исключение, создаваемое преобразователем метод или любые необработанные исключения, создаваемые методами, которые Преобразование вызовов методов, рассматриваются как ошибки во время выполнения. Ручка ожидаемые проблемы при возвращении DependencyProperty.UnsetValue.
ключи обрабатывать ожидаемые проблемы, возвращая DependencyProperty.UnsetValue.
когда вы смотрите на эти значения, вы узнаете, что они означают. Затем выберите правильный, чтобы вернуться в конвертер.
основная проблема заключается в том, что null может быть допустимым значением для свойства.
DependencyProperty.UnsetValue, чтобы указать, что свойство существует, но не имеет своего значения, установленного системное свойство
привязка.Пусто для указания движку привязки не передавать значение в целевой объект привязки, не переходить к следующей привязке в PriorityBinding, или не использовать FallBackValue или значение по умолчанию
редактировать
, чтобы указать, что вы не можете преобразовать значение, вы должны просто вернуть данное значение. Это лучшее, что вы можете сделать, потому что он возвращает проблему к автору привязки. Если вы вмешиваетесь в ценность, становится очень трудно найти то, что происходит.
после долгих размышлений и копания вокруг, кажется, что DependencyProperty.UnsetValue - это правильный выбор. Я перенес все в доме на эту модель с большим успехом. Кроме того, текст в разделе "Примечания"на этой странице указывает, что это, вероятно, лучший выбор..
существует также некоторое обсуждение о возврате входного значения, если привязка не может быть преобразована, но это может легко "сломать" систему привязки. Вспоминаю случай, когда привязка ввода 'строка' и 'кисть'. Возврат строки не будет работать!
то, что вы возвращаете по умолчанию, зависит от ситуации. Вы не хотите возвращать int по умолчанию для преобразователя в bool или возвращать bool для преобразователя для перечисления видимости.
обычно, если значение не может быть преобразовано, я бросаю Exception
это потому, что если я пытаюсь преобразовать значение с помощью недопустимого преобразователя, я хотел бы быть предупрежден об этом, чтобы я мог изменить свой код.
в некоторых редких случаях значение может быть допустимым, даже если оно не может быть преобразовано, и в этом случае я обычно возвращаю то же значение, которое было передано преобразователю. Это используется только в том случае, если я хочу, чтобы значение было преобразовано, если это возможно, или осталось прежним, если не.
еще один редкий случай, который я иногда делал, - это жесткое кодирование значения по умолчанию. Обычно это делается, когда я знаю, что преобразователь может использоваться с недопустимым параметром, и я хочу вернуть допустимое значение независимо от результата. Мои жестко закодированные преобразователи по умолчанию почти всегда возвращают логические значения.
Я не думаю, что я когда-либо возвращал любой из 3, которые вы указали (null
, DependencyProperty.UnsetValue
или Binding.DoNothing
), потому что эти значения часто неожиданные и не легко заметить если специально не искать их.
вы также можете вернуть real targetType
объект по умолчанию с помощью этой функции:
public static object GetDefault(Type type)
{
if(type.IsValueType)
{
return Activator.CreateInstance(type);
}
return null;
}