用MVVM模式开发中遇到的零散问题总结(3)——自制正则表达式万能绑定转换器
原文:用MVVM模式开发中遇到的零散问题总结(3)——自制正则表达式万能绑定转换器
前言
最近接受了3个项目的洗礼,出差近3个月,各种北京、广州、昆明来回奔波,好久没写博客了,之前我觉得我遇到的问题都比较零散所以就一篇博客写一大堆,这样导致文章太长,而且不方便填写关键字,所以之后这个系列我就以单个问题的形式来描述,望广大博友多多赐教~~
正文
我们知道在Binding的过程中是可以通过转换器来加工数据传输值的,我们当然希望ViewModel的代码越少越好,通用性越强越好,但是要如何才能做到万能呢??当然要借助强大的正则表达式了~~转换的过程我们可以看成是一个值的替换过程,如果能用上则表达式的替换功能,其参数可以在View里配置,这样同用性就很强了。
例如我们需要处理以下3个问题:
示例1:(“1”转为“男”,“0”转为“女”)
示例2:(“1988-10-08”转为“1988年10月08日”)
示例3:解析身份证信息(梁通通,男,汉,1988-10-08,环城东路304号,53250219881008xxxx,庞龙区公安局,1900-05-06,2100-15-09,云南省昆明市XX区XXXXX)单独提取姓名,性别等等.....
转换器代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Globalization;
using System.Text.RegularExpressions;
namespace CopSurface
{
[ValueConversion(typeof(string), typeof(String))]
public class RegexConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return RegexReplace(parameter,value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return RegexReplace(parameter, value);
}
/// <summary>
/// 用正则表达式对值进行多次替换。
/// </summary>
/// <param name="parameter">替换参数--格式为"patternStr-replacement,patternStr-replacement,..."
/// "@"前面为要匹配的正则表达式,后面为要替换的表达式。每一次用"~"隔开</param>
/// <param name="value">要替换的值</param>
/// <returns>替换结束的值</returns>
private object RegexReplace(object parameter, object value)
{
string str = parameter as string;
string strValue = value.ToString();
string[] strList = str.Split('~');
foreach (string item in strList)
{
string[] reg = item.Split('@');
strValue = Regex.Replace(strValue.ToString(), reg[], reg[]);
}
return strValue;
}
}
}
分隔符我是找了则表达式基本语法里没有的~@符号,当然了第一版没有考虑通配符的问题,有待以后改进
示例1:(1转为男,0转为女)
<TextBlock Text="{Binding data[sex],Converter={StaticResource RegexConverter},ConverterParameter='1|true@男~0|false@女~[2-9]@'}"/>
这样当data[sex]==1或者true是显示就为男,输入2就为女,输入其他的数字就不显示。
示例2:(1988-10-08转为1988年10月08日)
<TextBlock Text="{Binding data[Birthday], ConverterParameter=^\\d{4}@$0年~-\\d{2}-@$0月~-@~$@$0日, Converter={StaticResource RegexReplace}}"/>
当然了这只是其中的一个用法,这个转换器也可以用来做一些数据验证,比如输入的值匹配不上数字就替换为空 [^0-9]@,这样就屏蔽了英文字母了。
示例3:解析身份证信息(梁通通,男,汉,1988-10-08,环城东路304号,53250219881008xxxx,庞龙区公安局,1900-05-06,2100-15-09,云南省昆明市XX区XXXXX)提取出姓名
<TextBlock Text="{Binding data[IDCard],ConverterParameter=^(\\w+)\,(\\w+)\,(\\w+)\,(\\d{4}-\\d{2}-\\d{2})\,(\\w+)\,(\\w+)\,(\\w+)\,(\\d{4}-\\d{2}-\\d{2})\,(\\d{4}-\\d{2}-\\d{2})\,(\\w+)@$1, Converter={StaticResource RegexReplace}}" />
本人为了身份证仔细研究了正则表达式得出的以上结果。@之前为匹配整个身份证信息的正则表达式,然后用括号把独立的信息分组。@后的$1就为分组的第一项结果即text实际内容为 梁通通。想要获取生日就用$4,然后再用~链接实例2的表达式就可以转为年月日~~~
这个转换器的优点在于适应性强,缺点在于可读性弱,这么一大堆看着都眼花,而且必须对正则表达式有一定的了解,本人对正则表达式的了解处于初级阶段,相信各位大大可以用出更牛X的效果,欢迎各位博友提出宝贵的建议~
使用中可以先用 RegeX 3这个软件替换出自己想要的结果,然后再复制进去,RegeX 3 还可以查看每一个分组的结果哦。
由于有了正则表达式的帮助可以说这个转换器的潜力是无穷的,本人也只是昨天认真学习了下,更多关于正则表达式的使用推荐看这个:http://deerchao.net/tutorials/regex/regex.htm
用MVVM模式开发中遇到的零散问题总结(3)——自制正则表达式万能绑定转换器的更多相关文章
- 用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件
原文:用MVVM模式开发中遇到的零散问题总结(4)--自制摄像头拍摄大头贴控件 一直有个疑问,为什么silverlight对摄像头支持这么好,WPF却一个库都没有....于是我各种苦恼啊,各种Code ...
- 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机
原文:用MVVM模式开发中遇到的零散问题总结(5)--将动态加载的可视元素保存为图片的控件,Binding刷新的时机 在项目开发中经常会遇到这样一种情况,就是需要将用户填写的信息排版到一张表单中,供打 ...
- 用MVVM模式开发中遇到的零散问题总结(2)
原文:用MVVM模式开发中遇到的零散问题总结(2) 本节目录: 1.解决动画属性被劫持问题 2.设置页面焦点默认所在对象 3.XAML模拟键盘按键 4.DataGrid数据源绑定到复杂格式(dynam ...
- 用MVVM模式开发中遇到的零散问题总结(1)
https://www.cnblogs.com/tong-tong/archive/2011/11/28/2250948.html
- 【WPF开发备忘】使用MVVM模式开发中列表控件内的按钮事件无法触发解决方法
实际使用MVVM进行WPF开发的时候,可能会用到列表控件中每行一个编辑或删除按钮,这时直接去绑定,发现无法响应: <DataGridTemplateColumn Header="操作& ...
- C/S模式开发中如何利用WebBrowser控件制作导航窗体
原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...
- C# WPF开发之MVVM模式开发
MVVM模式由Model,View,ViewModel三部分组成. Model需继承INotifyPropertyChange(属性修改通知) ViewModel负责业务逻辑,连接View和Model ...
- Android 基于MVC的MVVM模式开发
由skay整理 http://blog.csdn.net/sk719887916/article/details/50386144 什么是MVVM 我们一步步来,从MVC开始. MVC 我们都知道, ...
- 简易的WPF MVVM模式开发
Model层 public class Song { private string _artistName; private string _songTitle; public string Song ...
随机推荐
- HOOK API入门之Hook自己程序的MessageBoxW(简单入门)
说到HOOK,我看了很多的资料和教程,无奈就是学不会HOOK,不懂是我的理解能力差,还是你们说的 不够明白,直到我看了以下这篇文章,终于学会了HOOK: http://blog.sina.com.cn ...
- keepalived小结
keepalived 启动流程: 启动三个进程(主进程.healthcheck 进程.vrrp进程)之后,先进入backup状态,运行一次vrrp_script成功后发现没有主,这时候会进入maste ...
- [CSS] Specify grid columns, rows, and areas at once with the grid-template shorthand
We can specify grid columns, rows, and areas in one property using the grid-template shorthand. .con ...
- RecyclerView的2种监听方式
NO.1:在自己定义适配器的ViewHolder里面写监听事件 //RecyclerView适配器 public class RecyclerViewAdapter extends RecyclerV ...
- SVN入门图解教程(超详细)
SVN入门图解教程(超详细) 一.总结 一句话总结: 二.SVN入门教程 1. 什么是SVN SVN全名Subversion,即版本控制系统.SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操 ...
- 我的Java开发学习之旅------>Java经典排序算法之归并排序
一.归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是採用分治法(Divide and Conquer)的一个很典型的应用.将已有序的子序列合并,得到全然有序的序列.即先使每一个子序列 ...
- Oracle中的游标(转)
Oracle中的游标有两种:显式游标.隐式游标.显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理,而隐式游标是在执行插入 (insert).删除 ...
- SQL SERVER CHARINDEX功能
CHARINDEX功能经常用于通过在字符或字符串中的字符范围搜索. 假定被搜索的字符包括字符搜索,然后该函数返回一个非零整数,的字符在被搜索的字符中的開始位数.即CHARINDEX函数返回字符或者字符 ...
- 关于java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccessible
<span style="font-size:18px;"> java.lang.NoSuchMethodError: org.springframework.util ...
- M创aterial Design作风Android申请书--创建列表和卡
本人全部文章首先公布于个人博客,欢迎关注,地址:http://blog.isming.me 上次说过使用主题,应用Material Design的样式,同一时候卡片布局也是Material Desig ...