DateTimeTypeConverterBase Class Libraryを使用しています(編集: TypeConverterを使用することもできましたが、@DeviantSeevの回答からは使用しなかったようです)。
あなたが話している「デフォルト」のコンバーターは実際にはTypeConverters( MSDN ) であり、v2.0 から .NET Framework の一部であり、基本クラス ライブラリ全体で使用されています。WPF の TypeConverters のもう 1 つの例は、ThicknessTypeConverterfor Padding、Margin、およびBorderThicknessプロパティです。コンマ区切りの文字列をThicknessオブジェクトに変換します。
それらをさらに理解したい場合は、利用可能な記事がたくさんあります。
TypeConverterクラスの実装とプロパティ/タイプのマークアップには、2 つの部分があります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 の非常に一般的なアクションは、aboolをVisibility;に変換することです。このような変換 ( Visible、Hidden、Collapsed) からの 3 つの可能な出力があり、2 つの入力 ( true、false) だけでは、これを a で決定するのは困難TypeConverterです。
私のアプリケーションでは、この 2 つの入力から 3 つの出力の問題を達成するためにBoolToVisibilityConverter、TrueValueとFalseValueプロパティを使用して 1 つを記述し、それを 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"/>