原文:用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. WP8.1:onedrive操作

    小梦今天给大家分享一下windows phone 8.1开发 onedrive中的一些操作: Windows phone 8.1 中 onedrive 登录 Windows phone 8.1 中 o ...

  2. [Angular Directive] 2. Add Inputs to Angular 2 Directives

    The @Input decorator allows you to pass values into your @Directive so that you can change the value ...

  3. PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($this, "cmp")))

    PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($ ...

  4. FireFox中使用showModalDialog显示的对话框不能用window.close()关闭

    FireFox中使用 showModalDialog 显示的对话框不能用 window.close() 进行关闭: 是FireFox的配置问题,解决方法如下: 在FireFox地址栏里输入 about ...

  5. 编辑器sublime、终端运行python

    sublime编辑器 Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用) Sublime Text是由程序员Jon Skinner于2008年1月份 ...

  6. 【codeforces 755C】PolandBall and Forest

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  7. [React] Normalize Events with Reacts Synthetic Event System

    Event handlers are passed an instance of SyntheticEvent in React. In this video we'll take a look at ...

  8. [Angular] Content Projection with ng-content

    For example there is tow form compoennts on the page, and what we want to do is reusing the form com ...

  9. 快速删除 jar 里面的 BuildConfig.class

    快速删除 jar 里面的 BuildConfig.class 起因:多个 jar 包里面的 BuildConfig.class 文件导致编译冲突. 方法一:土方法 使用 jar 解包 jar xf x ...

  10. List&lt;Map&lt;String, String&gt;&gt; 开启 Map&lt;String, List&lt;String&gt;&gt;

    将List变成Map结构体,下面的文字是没有水平! 写作方法传送前土壤很长一段时间.我不知道有没有好的解决办法.我们也希望提供! Map<String, String> map1 = ne ...