原文:用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)——自制正则表达式万能绑定转换器的更多相关文章

  1. 用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件

    原文:用MVVM模式开发中遇到的零散问题总结(4)--自制摄像头拍摄大头贴控件 一直有个疑问,为什么silverlight对摄像头支持这么好,WPF却一个库都没有....于是我各种苦恼啊,各种Code ...

  2. 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机

    原文:用MVVM模式开发中遇到的零散问题总结(5)--将动态加载的可视元素保存为图片的控件,Binding刷新的时机 在项目开发中经常会遇到这样一种情况,就是需要将用户填写的信息排版到一张表单中,供打 ...

  3. 用MVVM模式开发中遇到的零散问题总结(2)

    原文:用MVVM模式开发中遇到的零散问题总结(2) 本节目录: 1.解决动画属性被劫持问题 2.设置页面焦点默认所在对象 3.XAML模拟键盘按键 4.DataGrid数据源绑定到复杂格式(dynam ...

  4. 用MVVM模式开发中遇到的零散问题总结(1)

    https://www.cnblogs.com/tong-tong/archive/2011/11/28/2250948.html

  5. 【WPF开发备忘】使用MVVM模式开发中列表控件内的按钮事件无法触发解决方法

    实际使用MVVM进行WPF开发的时候,可能会用到列表控件中每行一个编辑或删除按钮,这时直接去绑定,发现无法响应: <DataGridTemplateColumn Header="操作& ...

  6. C/S模式开发中如何利用WebBrowser控件制作导航窗体

    原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...

  7. C# WPF开发之MVVM模式开发

    MVVM模式由Model,View,ViewModel三部分组成. Model需继承INotifyPropertyChange(属性修改通知) ViewModel负责业务逻辑,连接View和Model ...

  8. Android 基于MVC的MVVM模式开发

    由skay整理  http://blog.csdn.net/sk719887916/article/details/50386144 什么是MVVM 我们一步步来,从MVC开始. MVC 我们都知道, ...

  9. 简易的WPF MVVM模式开发

    Model层 public class Song { private string _artistName; private string _songTitle; public string Song ...

随机推荐

  1. An Overview of Cisco IOS Versions and Naming

    An Overview of Cisco IOS Versions and Naming http://www.ciscopress.com/articles/article.asp?p=210654 ...

  2. 细说Oracle中NULL值

    1.NULL是什么? NULL表示UNKNOW(未知),其不代表不论什么值. 比如一行中某列没有不论什么值即为NULL. ORACLE同意不论什么一种数据类型的字段为空,除了下面两种情况: 1)主键字 ...

  3. STS开发环境搭建与配置

    STS开发环境搭建与配置 (2012-04-11 07:24:51) 转载▼ 1.   环境准备 安装JDK.MAVEN 1.1.        下载 下载sprdfingsource-tool-su ...

  4. struts2_11_实现自己的拦截器的定义

    1)登录界面代码: <% //设置session的值keyword为user request.getSession().setAttribute("user", " ...

  5. Green the world :使用monkey_patch

    eventlet的monkey_patch 用于绿化一些python的模块,看看以下的样例就明确了 urls = ["http://www.haha.mx/joke/1292935" ...

  6. iOS开发 - Swift - 自己写的一个九宫格解锁的Demo

    前段时间做项目,公司要用到一个九宫格的手势解锁的需求. 虽然在很多地方都可以找到写好的第三方源码, 但是我的性格是不喜欢Ctrl+V的,于是自己凭着理解敲了一个出来,功能很简单,只是单纯的返回结果.附 ...

  7. Linux的设备文件名与硬盘分区已经挂载点的关系

    以CentOS6.3为例. 选择的硬盘设备名是/dev/sda,即第一块STAT硬盘,然后在该硬盘分了3个主分区和1个扩展分区,设备名分别是/dev/sda1,/dev/sda2,/dev/sda3, ...

  8. 获取当前div中的所有div的个数和每一个div的ID and 根据屏幕分辨率计算高度

    var tabs_Count=document.getElementById("tabs-panels").getElementsByTagName("div" ...

  9. Optimizing concurrent accesses in a directory-based coherency protocol

    In one embodiment, the present invention includes a directory to aid in maintaining control of a cac ...

  10. CUDA+OpenCV 绘制朱利亚(Julia)集合图形

    Julia集中的元素都是经过简单的迭代计算得到的,很适合用CUDA进行加速.对一个600*600的图像,需要进行360000次迭代计算,所以在CUDA中创建了600*600个线程块(block),每个 ...