双向绑定属性判断,避免重复绑定同一属性报错

本文介绍如何在WinForm中实现控件与数据源的双向绑定,重点讲解INotifyPropertyChanged接口的应用,并提供一种方法来避免重复绑定同一属性。

自从从WPF上学了点皮毛之后,开始也把上面的东西往WinForm上用,比如说双向绑定,重点是INotifyPropertyChanged的使用(原谅我这个一直搞web的人吧,貌似INotifyPropertyChanged在.net 2.0的时候已经有了,双向绑定的好处我就不说了)

先定义了一个类作为控件的数据源

    public class BindParamModel : INotifyPropertyChanged
    {
        private string _n;

        public event PropertyChangedEventHandler PropertyChanged;

        public string N
        {
            set
            {
                if (_n != value)
                {
                    _n = value;
                    OnPropertyChanged("N");
                }
            }
            get { return _n; }
        }
        ..........

        protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
上面的类继承INotifyPropertyChanged 接口,作为控件的数据源.

然后给一个TextBox 绑定这个数据源

control.DataBindings.Add("Text", BindParamModel, "N");
这样就把BindParamModel的N属性与TextBox的Text作了绑定,那么问题来了

这个

control.DataBindings.Add("Text", BindParamModel, "N");
我放在一个循环里面,DataBindings这个对象没有类似Contain这样的方法判断"Text"属性已被绑定过,再Add就会出错
我经过调试,发现DataBindings下有一个属性叫List(里面保存着控件上绑定的所有对象,Binding),不过它是一个private的非公开对象,只能通过反射得到它了,于是我有了下面的处理方法

        private static bool ControlHasBindProperty(Control control,string propertyName)
        {
            var listProperty =
                control.DataBindings.GetType()
                    .GetProperties(BindingFlags.NonPublic | BindingFlags.Instance)
                    .First(property => property.Name == "List");
            var bindList = (ArrayList) listProperty.GetValue(control.DataBindings, null);
            if (bindList.OfType<Binding>().FirstOrDefault(prop => prop.PropertyName == propertyName) != null)
                return true;
            return false;
        }
下面调用上面的函数先检查一下这个属性有没有被绑定过,接下来的事件就容易了

                    var hasBind = ControlHasBindProperty(textBox, "Text");
                    if (!hasBind)
                        textBox.DataBindings.Add("Text", BindParamModel, "N");




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值