为什么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 

相关文章
|
5月前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
121 10
|
10月前
|
NoSQL 关系型数据库 MySQL
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
275 2
|
11月前
|
机器学习/深度学习 算法 前端开发
集成学习的力量:Sklearn中的随机森林与梯度提升详解
【7月更文第23天】集成学习,作为机器学习中一种强大而灵活的技术,通过结合多个基础模型的预测来提高整体预测性能。在`scikit-learn`(简称sklearn)这一Python机器学习库中,随机森林(Random Forest)和梯度提升(Gradient Boosting)是两种非常流行的集成学习方法。本文将深入解析这两种方法的工作原理,并通过代码示例展示它们在sklearn中的应用。
508 10
|
Android开发
在Android上实现图像颜色过滤与反转
在Android上实现图像颜色过滤与反转
279 0
在Android上实现图像颜色过滤与反转
|
监控 Cloud Native 测试技术
持续集成与持续交付(CI/CD)在云原生环境中的应用与优化
传统软件开发模式下的集成和交付流程往往繁琐且易出错,而随着云原生技术的快速发展,持续集成与持续交付(CI/CD)在云原生环境中的应用变得尤为重要。本文将探讨CI/CD在云原生环境中的应用及优化策略,包括自动化测试、容器化部署以及监控和反馈机制等方面,旨在帮助开发团队更好地应对云原生时代的挑战。
224 2
|
算法 大数据 数据处理
【天衍系列 01】深入理解Flink的 FileSource 组件:实现大规模数据文件处理
【天衍系列 01】深入理解Flink的 FileSource 组件:实现大规模数据文件处理
297 4
|
XML 存储 JSON
详细比较JSON和XML这两种数据格式
详细比较JSON和XML这两种数据格式
723 2
|
Android开发
Android 开发 tablayout 字体加粗 ,简便的手法:
Android 开发 tablayout 字体加粗 ,简便的手法:
|
编译器 C++ Anolis
性能优化特性之:PGO
本文介绍了倚天实例上的编译优化特性:PGO,并从优化原理、使用方法进行了详细阐述。
|
存储 安全 关系型数据库
【MySQL技术内幕】8.4-二进制日志备份与恢复
【MySQL技术内幕】8.4-二进制日志备份与恢复
252 0