开发者社区> 大东瓜123> 正文

为什么databindings在绑定到属性值的时候,不能自动更新

简介: 在面向对象设计系统的时候,在设计的类的生成对象的后,为了呈现给客户,要绑定对象的属性到窗体,这时我们可以使用控件的databindings方法,如textBox1.DataBindings.Add("Text", cat, "Name"); 这样在textbox1中输入相应的信息后,cat的Name属性就会自然发生变化,这时,我们可以将这个对象持久化到数据库中,或者文本,及本地资源中 但是
+关注继续查看

在面向对象设计系统的时候,在设计的类的生成对象的后,为了呈现给客户,要绑定对象的属性到窗体,
这时我们可以使用控件的databindings方法,如
textBox1.DataBindings.Add("Text", cat, "Name");

这样在textbox1中输入相应的信息后,cat的Name属性就会自然发生变化,这时,我们可以将这个对象持久化到数据库中,或者文本,及本地资源中

但是一般来说,我们的系统涉及到的业务逻辑不会这么简单(只是数据库的存储)
举一个例子,我们在买东西的时候,在修改购买量的时候,我们希望在我们输入数量后,系统自动显示出总价来
以下是一个简单的例子,这时我们在写程序的时候,无论修改那个量,都可以得到正确的总价
label1.DataBindings.Add("Text",obj,"ItemsMoney");
但是:我们将总价绑定到了label1,在总价发生变化后,label1的text属性是不发生变化的,为什么呢,因为databinding不自动探测对象中属性值的变化
这样看上去,像是做了一半的工作,这个databindings看起来就不那么完美了

public class ShopItem
{
    
int price;
    
int totalmoney;
    
int num;
    
public int Price
    {
        
get{return price;}
        
set
        {
            
if(price!=value)
            {
                totalmoney
=price*number;
                price
=value;
            }
        }
        
    }

    
public int number
    {
        
get{}
        
set
        {
            
if(num!=value)
            {
                totalmoney
=price*number;
                num
=value;
            }
        }
    }

    
public int ItemsMoney
    {
        
get
        {
            
return totalmoney;
        }
    }
}

通过反射查看一下databindings的实现机制,起主要做用的就是binding类了,他通过反射取得对象的值,并赋值在控件的相应的属性上
[TypeConverter(typeof(ListBindingConverter))]
public class Binding

我们在程序中修改已经绑定了对象属性值的控件的值,对象的属性值是不会发生变化,说明binding捕获的是用户的输入消息,如wm_char,鼠标,等消息

现在我们来看一下,为什么不自动更新界面信息
如果我们要实现这个自动更新的功能,那么,属性值在发生变化时,必须产生一个消息,由binding处理,然后刷新界面
产生这个消息,我只想到两种方法
第一,修改property的实现机制,property的实现用类似方法的机制实现的,我不懂il所以不知道实现起来有没有困难,反正现在是没有
第二,在每一个属性修改时都引发一个event,然后将这个event交给binding处理
第二种方法,先不说他的代码量,在每一个property中都加入引发事件的语句
单是如何处理就是一个问题
这个binding必须必理所有的对象的属性变化,就是在每一个对象的创建时,都必须将他的propertychaged事件的处理函数交给databing处理,
那么这个binding就是一个全局的静态方法,(有可能会引发线程访问的问题),如果使用对象的话,那么在每一个类中都加入一个显示的部分,那么
业务逻辑与界面显示不完全分离,并且,开销也非常巨大,如果使用池的缓存机制,这样可能会减少一些开销.


所有只有选一个折中的办法,定义一个INotifyPropertyChanged接口,
那么,你想怎么办就怎么办吧

INotifyPropertyChanged接口实现的例子
http://blog.joycode.com/zhanbos/archive/2005/11/06/66492.aspx 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
绑定元素属性改变不通知界面
原文:绑定元素属性改变不通知界面 情景假设:绑定的是一个Point,当Point的X或者Y属性发生改变时,绑定的点也随界面改变 此时界面不会发生改变 原因:当X或者Y属性发生改变时并没有触发Point的Set方法   1 2 3 ...
520 0
自定义初学4——自定义属性
前面只是简单说了自定义View,接下来我们再来个增强版——自定义View的属性 1、自定义View的属性,首先在res/values/  下建立一个attrs.xml , 在里面定义我们的属性。
602 0
用自定义属性实现必需字段的检查
在持久化类时,一个对象需要保存到数据库中表,数据库中的表在设计时会根据一些设计范式的要求定义一些必要的字段这样,在持久化时,就必须检查一下这些与数据库映射字段是否已经赋值了,如果没有,则不能保存到数据库中,这时应弹出对话框来提示,以防止错误异常的发生. using System;using System.Collections.Generic;using System.Text;usi
725 0
X11/XWindow更改属性代码
X11/XWindow更改属性代码
19 0
关于Navisworks属性查看的问题(属性不显示)
关于Navisworks属性查看的问题(属性不显示)
16 0
silverlight中Combox绑定数据以及动态绑定默认选定项的用法
在Sliverlight中,经常要用到下拉框Combox,然而Combox的数据绑定却是一件令初学者很头疼的事情。今天就来总结一下下拉框的使用方法: 下面写一个简单的例子吧。先写一个日期的Model,代码如下: public class Date { public...
1066 0
附加属性的不同使用方式
原文:附加属性的不同使用方式     [AttachedPropertyBrowsableForType(typeof(ButtonBase))] public static void SetIsClearTextButtonBehaviorEnabled(Button obj, bool value) { obj.
671 0
42、属性的操作
元素对象有一个attributes属性,返回一个类似数组的动态对象,成员是该元素标签的所有属性节点对象,属性的实时变化都会反映在这个节点对象上。其他类型的节点对象,虽然也有attributes属性,但返回的都是null,因此可以把这个属性视为元素对象独有的。
61 0
+关注
大东瓜123
互联网码农一枚
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载