c# 自定义类型的DataBindings
自定义类型TextBoxEx,扩展了TextBox,增加了一个属性KeyText来保存后台的值(Tag已另作它用)。
程序里面需要将KeyText和DataTable的某个列绑定起来。
如果是TextBox,只需要简单处理即可:
txt.DataBindings.Add("Text", dt, colName, false, DataSourceUpdateMode.OnPropertyChanged);
如此,即可实现textbox和Datatable列的绑定,无论哪一个有修改,都会自动作用到另一个。
现在绑定的对象变成扩展的自定义控件TextBoxEx下的自定义属性KeyText,如上的绑定方式试过了,没有效果。即改变TextBoxEx的KeyText值,相应的DataTable里面的列下的值不会改变。这是怎么回事呢,问题的关键在后面的那句DataSourceUpdateMode.OnPropertyChanged上,到底什么时候会触发这个事件,又到底修改KeyText值的时候有没有触发这个事件呢。
原因没找到,但是应该是没有触发上面的事件。
解决方案有两种,第一种是我觉得比较挫的招,曲线解决。
这里的DataSourceUpdateMode下还有两个选项,一个是Never,还有一个是OnValidation。Never没什么功夫可做,可以在OnValidation上下手。
代码:
public class TextBoxEx : TextBox { string _keyText; [Browsable(false)] public string KeyText { get { return _keyText; } set { if (_keyText != value) { _keyText = value; OnValidating(new CancelEventArgs(false)); } } } }
在KeyText的set里面加上OnValidating,手动触发验证事件。方案可行,只是感觉有点小挫。
第二招是武林正派,从OnPropertyChanged上面下功夫。
代码:
public class TextBoxEx : TextBox, INotifyPropertyChanged { string _keyText; [Browsable(false)] public string KeyText { get { return _keyText; } set { if (_keyText != value) { _keyText = value; OnPropertyChanged("KeyText"); } } } protected void OnPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } } }
继承INotifyPropertyChanged,实现OnPropertyChanged,顿感高富帅了,有木有。
当然,上面两种,在绑定的时候要分别选择DataSourceUpdateMode.OnValidation和DataSourceUpdateMode.OnPropertyChanged。