zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    乱谈数学--傅里叶变换(级数)的原理(一)
    Linux day03
    Linux day02
    Linux day01(二)虚拟机快照和克隆的用法介绍
    Linux day01(一) 创建Linux虚拟机,设置虚拟机默认属性,虚拟机和Xhell建立连接
    Django day 38 结算中心,支付中心,计算价格方法
    Django day 37 网站视频的播放,购物车接口,优惠券表分析
    Django day 36 支付宝支付,微信推送
    Django day35 redis连接池,redis-list操作,django中使用redis,支付宝支付
    Django day 34 过滤课程,登录,redis,python操作redis
  • 原文地址:https://www.cnblogs.com/icyJ/p/OnPropertyChanged.html
Copyright © 2011-2022 走看看