我定义了一个类,在这个类里面用反射将此类中的一些字段与某窗体中的一些控件绑定,我希望这个反射操作只进行一次~也就是在实例化这个类的时候进行一次绑定~之后如果这个类中的字段值有所改变,窗体中相应的控件值能够自动变化~
我在这个类中定义了一个binding方法在这个方法中用如下语句进行数据源绑定~但是只能绑定一次~当这个类中字段值改变后窗体控件的值仍然是第一次绑定时的值~~请问这是为什么呢~?如果要达到我希望的效果该怎么做~?谢谢!TmpControl.DataBindings.Add(new Binding("SelectedIndex", this, objProperty.Name));TmpControl是利用反射找到的与类中某个字段相对应的控件,objProperty是此类中与该控件相对应的字段

解决方案 »

  1.   

    关于绑定,我曾得到的教训是,如果绑定的是一个非公有属性的话,非收到可能根本意想不到的效果,我还没用过把一个只有可以反射才能得到的属性应用于绑定,不过过去我在作程序时,误把一个属性的字母大小写搞错了,"绑定"自已还用反射真找到了个这错误的字段或属性,结果运行的结果是一踢糊涂,对于类的NonPublic成员,建议还是最好不要去绑定,甚至在不要在其他的反射中去操作,除非你对它实现机制非常了解.实际上这种操作类似于:
    LPCTSTR lpszAppConst=_T("我不可以改变");
    LPTSTR lpszTemp=(LPTSTR)lpszAppCont;
    lpszTemp[0]=0;
    这种操作被专家认为是非常"邪恶"的操作,参见《Effective C++》
      

  2.   

    To:jointan() 
    其实我需要绑定的也不是一些非公有属性~只是很普通的一些属性~比如TextBox的Text属性~或者DateTimePicker的Value属性~我的想法是~一个数据录入窗体可能会对应数据库中的多个表~我想定义一个类~用这个类把这个数据录入窗体所需要的数据表封装起来~统一的进行数据校验和存取工作~实际上就是用这个类当这个窗体的数据源~为了更通用一些,数据绑定工作是用反射进行的~但是我希望反射操作只进行一次~之后每次当类中字段值改变时(比如在窗体上点击了上一条或下一条按钮)窗体中控件的一些属性值能够自动改变~~不用再次去反射类中的字段了~~~
      

  3.   

    .Net绑定机制内部就是用反射实现的,你不想让他用反射都不成,而且这种反射对字段(非属性,实际上我感觉,如果发过去的是一个属性的话,实际上问题更少些,不过最我终放弃了这种尝试,也就没这方面的经验了),不过按你的想法,是你需要动态的去改变Bind中的源,也就你的new Binding()的第二个或第三个参数,那么,没有办法,你只有删掉第一个绑定,重建一个新的绑定。而且你把第三个参数的意义理解错了,一个绑定一位建立,他的"DataMember"是不可以自动改变的,如果需要改变,那么,就要对数据源的DataMember的改变建立一个事件,然后在事件中建立一个新的绑定。
      

  4.   

    To:jointan() 
     谢谢这位老哥~~~呵呵又明白许多~~谢谢!