封装WPF中转换器常用用法封装

[复制链接]
发表于 2025-10-14 19:35:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  • 代码经常碰到范例A转换到范例C,但是已经写好范例A转换到范例B、范例B转换范例C。通常碰到这种环境,通常会重新写过一个转换器来举行满足需求。以下是办理该痛点。
  1. /// <summary>
  2. /// 转换器组转换器
  3. /// </summary>
  4. [ContentProperty(nameof(Converters))]
  5. public class ValueConverterGroup : IValueConverter
  6. {
  7.     public List<IValueConverter> Converters { get; set; } = new List<IValueConverter>();
  8.     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  9.     {
  10.         if (this.Converters is IEnumerable<IValueConverter> converters)
  11.         {
  12.             return converters.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
  13.         }
  14.         return DependencyProperty.UnsetValue;
  15.     }
  16.     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  17.     {
  18.         if (this.Converters is IEnumerable<IValueConverter> converters)
  19.         {
  20.             return converters.Reverse().Aggregate(value, (current, converter) => converter.ConvertBack(current, targetType, parameter, culture));
  21.         }
  22.         return DependencyProperty.UnsetValue;
  23.     }
  24. }
复制代码
  1.         <local:ValueConverterGroup x:Key="StringToVisibilityConvert">
  2.             <local:StringToUpperConvert />
  3.             <local:StringToVisibilityConvert />
  4.         </local:ValueConverterGroup>
复制代码

  • 使用MarkupExtension举行封装转换器
  1.     public abstract class ValueConverterBase : MarkupExtension, IValueConverter
  2.     {
  3.         public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);
  4.         public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  5.         {
  6.             return Binding.DoNothing;
  7.         }
  8.         public override object ProvideValue(IServiceProvider serviceProvider)
  9.         {
  10.             return this;
  11.         }
  12.     }
复制代码
使用该类封装StringToUpperConvert
  1.         //使用: <TextBlock Text="{Binding TestText, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, Converter={local:StringToUpperConvert}}" />
  2.     public class StringToUpperConvert : ValueConverterBase
  3.     {
  4.         public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  5.         {
  6.             if (value is not null && value is string)
  7.             {
  8.                 return ((string)value).ToUpper();
  9.             }
  10.             return Binding.DoNothing;
  11.         }
  12.     }
复制代码
3.转换器单例
  1.     //使用:<TextBlock Text="{Binding TestText, Converter={x:Static local:StringToUpperConvert.Instance}}" />
  2.    public class StringToUpperConvert : IValueConverter
  3.    {
  4.        public static StringToUpperConvert Instance { get;set; } = new StringToUpperConvert();
  5.        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  6.        {
  7.            if (value is not null && value is string)
  8.            {
  9.                return ((string)value).ToUpper();
  10.            }
  11.            return Binding.DoNothing;
  12.        }
  13.        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  14.        {
  15.            return DependencyProperty.UnsetValue;
  16.        }
  17.    }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表