封装WPF中转换器常用用法封装
- 代码经常遇到类型A转换到类型C,但是已经写好类型A转换到类型B、类型B转换类型C。往往遇到这种情况,通常会重新写过一个转换器来进行满足需求。以下是解决该痛点。
/// <summary>
/// 转换器组转换器
/// </summary>
[ContentProperty(nameof(Converters))]
public class ValueConverterGroup : IValueConverter
{
public List<IValueConverter> Converters { get; set; } = new List<IValueConverter>();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (this.Converters is IEnumerable<IValueConverter> converters)
{
return converters.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
}
return DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (this.Converters is IEnumerable<IValueConverter> converters)
{
return converters.Reverse().Aggregate(value, (current, converter) => converter.ConvertBack(current, targetType, parameter, culture));
}
return DependencyProperty.UnsetValue;
}
}
<local:ValueConverterGroup x:Key="StringToVisibilityConvert">
<local:StringToUpperConvert />
<local:StringToVisibilityConvert />
</local:ValueConverterGroup>
- 使用MarkupExtension进行封装转换器
public abstract class ValueConverterBase : MarkupExtension, IValueConverter
{
public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);
public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
使用该类封装StringToUpperConvert
//使用: <TextBlock Text="{Binding TestText, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, Converter={local:StringToUpperConvert}}" />
public class StringToUpperConvert : ValueConverterBase
{
public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is not null && value is string)
{
return ((string)value).ToUpper();
}
return Binding.DoNothing;
}
}
3.转换器单例
//使用:<TextBlock Text="{Binding TestText, Converter={x:Static local:StringToUpperConvert.Instance}}" />
public class StringToUpperConvert : IValueConverter
{
public static StringToUpperConvert Instance { get;set; } = new StringToUpperConvert();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is not null && value is string)
{
return ((string)value).ToUpper();
}
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}