Он использует DateTimeTypeConverter
из библиотеки базовых классов ( РЕДАКТИРОВАТЬ: Ну, он мог бы использовать TypeConverter, однако, похоже, что из @ DeviantSeev ответа , что они не сделали ).
Существуют конвертеры по умолчанию, о которых вы говорите, на самом деле TypeConverters
( MSDN ), и они были частью .NET Framework начиная с версии 2.0, и они используются в Base Библиотеки классов. Другим примером преобразователей типов в WPF являются свойства ThicknessTypeConverter
для Padding
, Margin
и BorderThickness
. Он преобразует строку с разделителями-запятыми в объект Thickness
.
Есть множество из статей , доступных, если вы хотите понять их подробнее .
Существует две части использования TypeConverter
- реализации класса, а затем разметка ваших свойств / типов с помощью TypeConverterAttribute
.
Например, недавно у меня был пользовательский элемент управления, который требовал char[]
, который я хотел установить из Xaml
, например, так:
<AutoCompleteTextBox MultiInputDelimiters=",;. " />
Использование
[TypeConverter(typeof(CharArrayTypeConverter))]
public char[] MultiInputDelimiters
{
get { return (char[])GetValue(MultiInputDelimitersProperty); }
set { SetValue(MultiInputDelimitersProperty, value); }
}
Осуществление
public class CharArrayTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return (Type.GetTypeCode(sourceType) == TypeCode.String);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
return ((string)value).ToCharArray();
return value;
}
}
Когда использовать TypeConverter
?
Вы можете использовать TypeDescriptors
, только если вы пишете пользовательский элемент управления, так как вам нужно пометить свойство с помощью TypeDescriptorAttribute
. Также я бы использовал TypeConverter
, только если преобразование довольно простое - как в примере выше, где у меня есть строка и я хочу char[]
- или если есть несколько возможных форматов, из которых я хочу преобразовать.
Вы пишете IValueConverter
, когда вы хотите больше гибкости в том, как преобразовать значение, управляя им по данным или передавая параметр. Например, очень распространенным действием в WPF является преобразование bool
в Visibility
; Есть три возможных выхода из такого преобразования (Visible
, Hidden
, Collapsed
) и только с двумя входами (true
, false
) трудно решить это в TypeConverter
.
В моих приложениях для достижения этой проблемы ввода-вывода в три вывода я написал один BoolToVisibilityConverter
со свойствами TrueValue
и FalseValue
, а затем трижды скопировал его в свой глобальный ResourceDictionary
. Я опубликую пример кода завтра утром, прямо сейчас передо мной нет. .
[ValueConversion(typeof(bool), typeof(Visibility))]
public class BooleanToVisibilityConverter : IValueConverter
{
public Visibility FalseCondition { get; set; }
public Visibility TrueCondition { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool)value) ? TrueCondition : FalseCondition;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((bool)value)
return TrueCondition;
return FalseCondition;
}
}
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" FalseCondition="Collapsed" TrueCondition="Visible"/>
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityCollapsedConverter" FalseCondition="Visible" TrueCondition="Collapsed"/>
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityHiddenConverter" FalseCondition="Visible" TrueCondition="Hidden"/>
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityHiddenWhenFalseConverter" FalseCondition="Hidden" TrueCondition="Visible"/>