用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 ...
随机推荐
- WP8.1:onedrive操作
小梦今天给大家分享一下windows phone 8.1开发 onedrive中的一些操作: Windows phone 8.1 中 onedrive 登录 Windows phone 8.1 中 o ...
- [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 ...
- 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($ ...
- FireFox中使用showModalDialog显示的对话框不能用window.close()关闭
FireFox中使用 showModalDialog 显示的对话框不能用 window.close() 进行关闭: 是FireFox的配置问题,解决方法如下: 在FireFox地址栏里输入 about ...
- 编辑器sublime、终端运行python
sublime编辑器 Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用) Sublime Text是由程序员Jon Skinner于2008年1月份 ...
- 【codeforces 755C】PolandBall and Forest
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- [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 ...
- [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 ...
- 快速删除 jar 里面的 BuildConfig.class
快速删除 jar 里面的 BuildConfig.class 起因:多个 jar 包里面的 BuildConfig.class 文件导致编译冲突. 方法一:土方法 使用 jar 解包 jar xf x ...
- List<Map<String, String>> 开启 Map<String, List<String>>
将List变成Map结构体,下面的文字是没有水平! 写作方法传送前土壤很长一段时间.我不知道有没有好的解决办法.我们也希望提供! Map<String, String> map1 = ne ...