WPF转换器之通用转换器

WPF中的转换器是一个非常好的数据类型转换解决方案,实用和强大, 它的作用是将源数据转换为WPF自身需要的类型,对数据实体没有侵略性,会在项目工程中频繁使用。所以掌握转换器是WPF开发的必备技能。

我刚接触转换器的时候,没有考虑通用性,每次遇到一个转换需求都会去创建一个新的转换器,久而久之,项目中的转换器已多如牛毛

这当然是我无法容忍的,我决定用一种通用转换器来代替绝大部分性质相同的转换操作,通过约定一套参数规则来适应不同的转换场景,达到转换器复用的目的。

转换器分为两种,IValueConverter(单值转换器)和IMultiValueConverter(多值转换器)

单值通用转换器 ObjectConverter

参数规则【比较值1|比较值2:true返回值:false返回值】

仔细一看,这个参数规则其实和三元表达式的含义相同,当源数据等于比较值1或者比较值2的时候,返回true返回值,否则返回false返回值

有了这个规则,就可以实现通用转换需求了,ObjectConverter源码如下

 public class ObjectConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string[] parray = parameter.ToString().ToLower().Split(‘:‘); //将参数字符分段 parray[0]为比较值,parray[1]为true返回值,parray[2]为false返回值
            if (value == null)
                return parray[2];  //如果数据源为空,默认返回false返回值
            if (parray[0].Contains("|"))  //判断有多个比较值的情况
                return parray[0].Split(‘|‘).Contains(value.ToString().ToLower()) ? parray[1] : parray[2];  //多值比较
            return parray[0].Equals(value.ToString().ToLower()) ? parray[1] : parray[2];  //单值比较
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var returnValue = "otherValue";
            string[] parray = parameter.ToString().ToLower().Split(‘:‘);
            if (value == null)
                return returnValue;
            var valueStr = value.ToString().ToLower();
            if (valueStr != parray[1])
                return returnValue;
            else
                return parray[0].Contains(‘|‘) ? parray[0].Split(‘|‘)[0] : parray[0];
        }
    }

 ObjectConverter的使用

1 <converter:ObjectConverter x:Key="objConverter"/>
2
3 <Border Visibility="{Binding PanelStatus,  Converter={StaticResource objConverter},ConverterParameter=true:Visible:Collapsed}">
4
5 <Border Background="{Binding BgColor,  Converter={StaticResource objConverter},ConverterParameter=1:Red:Blue}">
6
7 <TextBlock Text="{Binding Type, Converter={StaticResource objConverter},ConverterParameter=1|2:VIP会员:普通会员}"/>

多值通用转换器 MultiObjectConverter

参数规则【各组比较值:比较条件(&amp;或|):true返回值:false返回值:返回值类型枚举】

多值转换器的参数规则略显麻烦,但是也和三元表达式类似,只不过多了比较条件和返回值枚举类型,这里有人要问了为什么单值转换器不需要声明返回值枚举而多值转换器需要,这是因为多值转换器的返回值不返回实际类型的话,返回类型会失效,WPF的默认转换器似乎没有起到作用。这个问题我也正在研究,所以先定义一个返回值枚举用来转换返回值的类型。姑且算一个临时解决方案吧

 1 public class MultiObjectConverter : IMultiValueConverter
 2     {
 3         /// <summary>
 4         /// 多值转换器
 5         /// </summary>
 6         /// <param name="values">参数值数组</param>
 7         /// <param name="parameter">
 8         /// <para>参数</para>
 9         /// <para>各组比较值:比较条件(&amp;或|):true返回值:false返回值:返回值类型枚举</para>
10         /// <para>v1;v2-1|v2-2;v3:&amp;:Visible:Collapsed:1</para>
11         /// </param>
12         /// <returns></returns>
13         public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
14         {
15             string[] param = parameter.ToString().ToLower().Split(‘:‘);   //将参数字符串分段
16             string[] compareValues = param[0].Split(‘;‘); //将比较值段分割为数组
17             if (values.Length != compareValues.Length)  //比较源数据和比较参数个数是否一致
18                 return ConvertValue(param[3], param[4]);
19             var trueCount = 0; //满足条件的结果数量
20             var currentValue = string.Empty;
21             IList<string> currentParamArray = null;
22             for (var i = 0; i < values.Length; i++)
23             {
24                 currentValue = values[i] != null ? values[i].ToString().ToLower() : string.Empty;
25                 if (compareValues[i].Contains("|"))
26                 {
27                     //当前比较值段包含多个比较值
28                     currentParamArray = compareValues[i].Split(‘|‘);
29                     trueCount += currentParamArray.Contains(currentValue) ? 1 : 0;  //满足条件,结果+1
30                 }
31                 else
32                 {
33                     trueCount += compareValues[i].Equals(currentValue) ? 1 : 0;  //满足条件,结果+1
34                 }
35             }
36             currentParamArray = null;
37             currentValue = string.Empty;
38             var compareResult = param[1].Equals("&") ?
39                 trueCount == values.Length :
40                 trueCount > 0;   //判断比较结果
41             return ConvertValue(compareResult ? param[2] : param[3], param[4]);
42         }
43
44         public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
45         {
46             throw new NotImplementedException();
47         }
48
49         private object ConvertValue(string result, string enumStr)
50         {
51             var convertResult = (ConvertResult)int.Parse(enumStr);
52             if (convertResult == ConvertResult.显示类型)
53                 return result.Equals("collapsed") ? Visibility.Collapsed : Visibility.Visible;
54             if (convertResult == ConvertResult.布尔类型)
55                 return System.Convert.ToBoolean(result);
56             return null;  //后续自行扩展
57         }
58
59         private enum ConvertResult
60         {
61             显示类型 = 1,
62             布尔类型 = 2,
63             字符串类型 = 3,
64             整型 = 4,
65             小数型 = 5,
66             画刷类型 = 6,
67             样式类型 = 7,
68             模板类型 = 8
69         }
70     }

MulitObjectConverter的使用

1 <TextBlock Text="test">
2    <TextBlock.Visibility>
3         <MultiBinding Converter="{StaticResource mobjConverter}"
4                       ConverterParameter="1|2;true:|:Visible:Collapsed:1">
5              <Binding Path="Filed1"/>
6              <Binding Path="Filed2"/>
7         </MultiBinding>
8     </TextBlock.Visibility>
9 </TextBlock>    

单值通用转换器和多值通用转换器已经讲完了,读者可以根据自己的需求定制ConverterParameter的规则,实现灵活扩展。欢迎入群交流372754241

时间: 2024-08-13 06:28:43

WPF转换器之通用转换器的相关文章

PDF转换成Word转换器的神奇地方

最近有许多的朋友在群里说,希望可以找到一款能使PDF编辑.打印限制的小软件,将PDF文件格式轻松的转换成Word格式,毕竟在日常的办公或生活上的文档通用程度和编辑的难度相对要高一些. 今天给大家说一款能做到PDF转换Word格式的免费工具,收藏它,你不再需要烦恼这些事,只需一台电脑,轻松把PDF文档转换成word,马上就能帮你还原成doc格式的文档,非常方便实用! 让我们来看看这个软件PDF转换成Word转换器的神奇吧 此工具选择本地的需要转换的PDF文件,然后选择需要转换的格式类型,是转Wor

ppt转换成pdf转换器教程

ppt转换成pdf转换器教程ppt幻灯片是工作学习常常接触的文件,它操作容易,效果明显,很多办公人员青睐于ppt的制作,但是也可能会遇到各种问题,比如做好的ppt在演示的时候会出现声音.动画.字体的一些问题,如果能将ppt转换成pdf这样的话就会方便很多,也不容易有各种问题.针对这类情况,如果有朋友需要转换的可以网上下载安装迅捷ppt转pdf转换器,这样问题就会迎刃而解. 迅捷ppt转换成pdf转换器的使用过程 1. 打开pdf转换器,点击进入软件. 2. 选择需要使用的模式,如果需要将文件转化

ppt转换成pdf转换器绿色版

ppt转换成pdf转换器绿色版批量办公文档转换软件,可以一次性批量地将Office办公文档换为pdf,支持命令行参数,使得转换工作可以自动运行,这里菜鸟把我的方法写下来,分享给朋友们,希望能帮到大家,更希望起到抛砖引玉的作用,有更好地方法被分享出来. 软件简介: 迅捷ppt转换成pdf转换器可用于Acrobat pdf文件批量转换为PowerPoint(幻灯片)演示文稿.ppt转换成pdf转换器是一个专业的pdf解决方案,将pdf转换为PowerPoint 2010,2007,2003,2000

ppt转换成pdf转换器破解版教程

ppt转换成pdf转换器破解版教程 如何将ppt转成pdf?ppt文档转换就是一个糟心的事情,大部分软件只能做到只能做到大部分转换成功,无法实现完美,但是还是有一款专业的PDF转换软件在技术上能够实现文档格式完美的兼容处理! 转换技巧: 1.首先安装迅捷ppt转换成pdf转换器,注意一定是V4.1版的,这款功能相对于以往的版本更加强大.具体下载过程可以按照官网软件下载说明一步确定即可. 2.安装完成后单击”目标文件格式“下方的”Office转pdf“;鼠标放置”添加文件“按钮上,打开需要转换的文

ppt转换成pdf转换器在线

ppt转换成pdf转换器在线什么是ppt在线转换pdf转换器?有很多网友不希望在电脑上安装一些软件,那在线转换绝对是个不错的选择.何为在线转换器?ppt转换成pdf转换器在线转换怎么转?迅捷ppt转换成pdf转换器相信大家应该都会有所认识,现在迅捷pdf转换器就可以实现在线转换. 迅捷pdf转换器借助先进的pdf解析技术,成功的开发了云端服务版本.仅仅需要通过访问页面就可以实现转换,无需用户安装下载软件也可以轻松实现ppt转换成pdf的在线转换.除了ppt转换成pdf格式的转换,目前还支持wor

PPT转换成PDF转换器免费破解版

PPT转换成PDF转换器免费破解版对PPT转换成PDF文件内容进行编辑,最好办法是选择一款专业好用的PPT转换成PDF转换器,能适用于办公各种流行文件的转换,并且转换的效果要与原文保持一致.本章与大家分享一款转换效果出色的转换器——迅捷PPT转换成PDF转换器. PPT转换成PDF转换软件特征: ppt转换成pdf转换器完美的PPT转换成PDF文件识别技术: PPT转换成PDF转换器拥有先进的PPT转换成PDF文件识别技术,能够深入PPT转换成PDF文件内容进行扫描和分析,结合软件提供的转换接口

excel转换成pdf转换器哪个好

excel转换成pdf转换器哪个好?作为办公人员,不可避免的要接触到excel软件,对于一名计算机专业毕业的工作者来说,制作一份excel文件那是相当简单的事情,一般情况下不会出现任何的问题.但是,如果办公人员需要将多份excel文件转换成pdf文件,那又该怎么办呢?有这方面经历的工作者都知道,现在网络上有多款针对这方面问题的excel转换成pdf转换器,这无疑为用户添加了很多选择上的烦恼,现在问题来了,excel转换成pdf转换器哪个好? 说到excel转换成pdf转换器,很多用户不免会想到迅

ppt转换成pdf转换器下载

ppt转换成pdf转换器下载日常的工作和学习中,经常要碰到各种文档之间的相互转换问题,其中pdf文档转换为ppt文档尤为常见,经常遇到一门课已经有了ppt文档,但又需要pdf文档用于阅览这种情况.如果逐个文件.逐页.逐个文本框的复制,但工作量十分可怕,而且容易出错:利用迅捷ppt转换成pdf转换器提供的先进识别设备能让再复杂的文字图片清晰识别出来,完美解决ppt文档想pdf文档的转换问题. 最为简单的转换方法可以归纳为以下2种,分别叙述如下: 方法一,使用迅捷版ppt转pdf转换器,首先进入pp

pdf转换成word转换器哪个好用

学生提交的论文是Word文档格式,需通过迅捷在线PDF转换成Word转换器等工具转换成PDF文档格式,转换过程比较简单.但是把PDF文档转换成Word文档以后,还必须在文档中添加一些图片,丰富内容,转载一下操作步骤: 1.百度搜索关键词[PDF转Word转换软件],进入网站页面后,单击格式类型中“PDF转Word”,确认无误后,下一步. 2.点击PDF软件的“添加文件”按钮,在弹出的窗口中选中“PDF文件",确认后,即可设置”自定义文件件“为新文件Word的保存路径; 3.单击“开始转换”按钮,