它使用来自基类库的DateTimeTypeConverter
(编辑:那么,它也可以使用的TypeConverter,但似乎从@DeviantSeev's answer他们没有)。
您谈论的'默认'转换器实际上是TypeConverters
(MSDN),自从v2.0以来,它们一直是.NET Framework的一部分,它们被用于整个基类库。 WPF中TypeConverters的另一个示例是ThicknessTypeConverter
,用于Padding
,Margin
和BorderThickness
属性。它将逗号分隔的字符串转换为Thickness
对象。
有plenty的articles可用,如果你想understand them further。
使用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
中决定。
在我的应用程序,来实现这个两个输入三个输出问题,我在全球ResourceDictionary
写一个BoolToVisibilityConverter
与TrueValue
和FalseValue
属性,然后我实例三次。
明天早上我会发布代码示例,现在我不在眼前。
。
[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"/>
感谢Dennis,但是那么您何时需要编写自己的IValueConverter?据推测,涉及的房产类型没有定义转换器? – sturdytree 2012-03-08 22:10:37
我的理解是TypeConverters主要被WPF用来将XAML属性值(它们都是字符串)转换为相关的对象,例如Point =“10,10”会导致WPF使用PointConverter。 – sturdytree 2012-03-08 22:24:13
编辑发布并回复您的评论,因为评论字段中没有足够的空间足够详细地解释。 – Dennis 2012-03-08 22:29:58