关于TextBox内容自动变换的设计:
首先定义接口
public interface IConverter {
string Convert(string value);
}
然后定义具体的转换类,比如金额类型值自动加逗号转换类
public class CurrentMoneyConverter : IConverter {
public string Convert(string value) { ...} //实现具体的转换逻辑
}
定义保存需要转换的对象控件的容器类
public class ActiveConverter {
// 保存追加的控件及其对应的转换模式
private Dictionary<Control, Queue<IConverter>> dic = new Dictionary<Control, Queue<IConverter>>();
// 追加需要转换的控件及转换模式的方法
public void AddConverter(Control control, IConverter converter) {
if (dic.ContainsKey(control)) {
if (dic[control].Contains(converter) == false) {
dic[control].Enqueue(converter);
}
} else {
Queue<IConverter> queue = new Queue<IConverter>();
queue.Enqueue(converter);
dic.Add(control, queue);
control.Leave += new EventHandler(this.DoConversion);
}
}
// 转换事件
private void DoConversion(object sender, EventArgs e) {
Control control;
if (sender is Control) {
control = (Control)sender;
} else {
return;
}
Queue<IConverter> queue;
if (dic.ContainsKey(control)) {
queue = dic[control];
} else {
return;
}
foreach (IConverter converter in queue) {
try {
control.Text = converter.Convert(control.Text);
} catch {
// TODO
}
}
}
public ActiveConverter() {
return;
}
}
最后,在画面类里定义ActiveConverter 的实例,在画面出始化的时候,实例化,并追加需要转换的控件
this.activeConverter.AddConverter(this.tbxA, new CurrentMoneyConverter());
this.activeConverter.AddConverter(this.tbxB, new AlphanumericOnlyConverter());
此设计思想重点在于简化画面类设计,使其只专注于数据表示.
转载于:https://my.oschina.net/cjkall/blog/195889