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

相关文章
|
Linux 网络安全 数据安全/隐私保护
SSH - 远程连接中遇到的两个坑与SSH
SSH - 远程连接中遇到的两个坑与SSH
553 0
|
9月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
527 3
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
1026 0
|
监控 安全 网络协议
永久免费SSL证书教程—自动续签
要实现免费SSL证书的自动续签,选择合适的证书颁发机构(CA)至关重要。推荐使用JoySSL,填写注册码230922可获得免费且支持自动续签的SSL证书。申请步骤包括注册账户、选择证书类型、提交申请、验证域名所有权及安装证书。配置自动续签需安装续签工具、生成密钥和CSR,并设置续签参数。定期检查证书状态、备份证书和密钥,确保续签顺利进行。注意CA机构的政策和服务条款变化,以保持证书的有效性。
|
存储 API Android开发
kotlin开发安卓app,使用webivew 触发 onShowFileChooser, 但只能触发一次,第二次无法触发,是怎么回事。 如何解决
在Android WebView开发中,`onShowFileChooser`方法用于开启文件选择。当用户只能选择一次文件可能是因为未正确处理选择回调。解决此问题需确保:1) 实现`WebChromeClient`并覆写`onShowFileChooser`;2) 用户选择文件后调用`ValueCallback.onReceiveValue`传递URI;3) 传递结果后将`ValueCallback`设为`null`以允许再次选择。下面是一个Kotlin示例,展示如何处理文件选择和结果回调。别忘了在Android 6.0+动态请求存储权限,以及在Android 10+处理分区存储。
|
Android开发 Kotlin
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【本地】音频,播放完随机播放下一首,遇到播放错误,也自动播放下一首
使用Kotlin和Jetpack Compose开发的安卓应用中,实现了两个EvoPlayer同时播放res/raw目录下的音频。一个音轨播放人声(顺序播放),另一个播放背景音乐(随机播放)。每个音轨都有独立的播放和停止控制,且在播放结束或遇到错误时会自动切换到下一首。MediaPlayer置于ViewModel中,UI界面包含播放和停止按钮,控制两个音轨。每次切换音频前,还会随机调整播放速度在0.9到1.2之间。代码示例展示了如何创建ViewModel和UI以实现这一功能。
|
监控 安全 Linux
Linux命令truss详解:系统调用跟踪的利器
`truss`(或`strace`)是Linux调试利器,用于跟踪系统调用和信号。它帮助开发者优化性能、调试错误和进行安全审计。通过附加到进程,记录调用细节、参数、返回值和错误。使用参数如`-d`显示调试信息,`-e`跟踪特定调用,`-o`输出到文件,`-p`跟踪指定进程。注意其对性能的影响,通常需要root权限,并建议过滤输出和结合其他工具分析。
|
域名解析 网络协议 网络架构
XBox提升下载速度的方法
XBox提升下载速度的方法
1748 1
|
消息中间件 缓存 API
Kotlin中的StateFlow和SharedFlow有什么区别?
- `StateFlow`持有一个最新的状态值,适合UI状态管理,新订阅者立即收到当前值。 - `SharedFlow`是通用热流,用于事件总线,不保留最新状态但可配置重播。 - `StateFlow`继承自`SharedFlow`,更专注于状态管理,而`SharedFlow`提供事件处理灵活性。 - 示例中展示了如何`emit`新值和`collect`变化。 - 选择`StateFlow`用于单最新状态共享,`SharedFlow`则适用于需要事件历史或定制策略的场景。 关注公众号“AntDream”了解更多内容!
312 1
|
机器学习/深度学习 人工智能 算法
提升深度学习模型性能的优化技术
【5月更文挑战第29天】 随着人工智能领域的快速发展,尤其是深度学习技术的广泛应用,如何有效提升模型的性能成为了研究热点。本文将探讨几种用于提高深度学习模型性能的优化技术,包括数据增强、正则化方法、网络结构调整以及超参数优化等。通过对比实验和理论分析,展示了这些技术在实际应用中的有效性和局限性,并提出了未来可能的研究方向。