它正在使用DateTimeTypeConverter
来自基类库(EDIT:好吧,它本来可以使用 TypeConverter 但看起来从@DeviantSeev 的回答 https://stackoverflow.com/a/9625068/73025他们没有)。
您所说的“默认”转换器实际上是TypeConverters
(MSDN http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx)并且自 v2.0 起它们就成为 .NET Framework 的一部分,并在整个基类库中使用。 WPF 中类型转换器的另一个示例是ThicknessTypeConverter
for Padding
, Margin
, and BorderThickness
特性。它将逗号分隔的字符串转换为Thickness
目的。
有plenty http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx of articles http://www.codeproject.com/Articles/6390/Introduction-to-the-TypeConverter如果您愿意的话可以使用进一步了解他们 http://www.csharphelp.com/2007/07/c-type-converters-your-friendly-helpers/.
使用a有两个部分TypeConverter
- 类的实现,然后标记你的属性/类型TypeConverterAttribute
.
例如,我最近有一个自定义控件,需要char[]
我想从Xaml
像这样:
<AutoCompleteTextBox MultiInputDelimiters=",;. " />
Usage
[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
to Visibility
;这种转换有三种可能的输出(Visible
, Hidden
, Collapsed
)并且只有两个输入(true
, false
)很难在一个TypeConverter
.
在我的应用程序中,为了实现两个输入到三个输出的问题,我编写了一个BoolToVisibilityConverter
with a TrueValue
and 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"/>