它使用的是DateTimeTypeConverter
来自基类库的(编辑:嗯,它本可以使用 TypeConverter,但是从@DeviantSeev 的回答看来他们没有使用)。
您所说的“默认”转换器实际上是TypeConverters
(MSDN),并且自 v2.0 以来它们一直是 .NET Framework 的一部分,并且它们在整个基类库中都被使用。WPF 中 TypeConverters 的另一个示例是ThicknessTypeConverter
for 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 中一个非常常见的操作是将 a 转换bool
为Visibility
; 这种转换有三个可能的输出 ( Visible
, Hidden
, Collapsed
) 并且只有两个输入 ( true
, false
) 很难在 a 中决定这一点TypeConverter
。
在我的应用程序中,为了实现这两个输入到三个输出的问题,我编写了一个BoolToVisibilityConverter
带有 aTrueValue
和FalseValue
属性的单个,然后在我的 global 中实例化了 3 次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"/>