码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Winform和WPF数据绑定区别小结


            首先说WPF,初识数据绑定这一概念,是在做了3年Winform开发,后转做WPF项目,按照MVVM模型进行编码时,才开始了解使用的。

            而一直以为数据绑定作为MVVM的核心内容,仅在WPF上适用,后来才了解到在Winform中同样适用,比较著名的比如国产的DevExpress控件,相信做Winform开发的都会有所耳闻。

            那么,总结一下个人认识下来,对两者在数据绑定上的区别:

    WPF:

    核心接口:INotifyPropertyChanged

    1. namespace System.ComponentModel
    2. {
    3. //
    4. // 摘要:
    5. // 通知客户端属性值已更改。
    6. public interface INotifyPropertyChanged
    7. {
    8. //
    9. // 摘要:
    10. // 在属性值更改时发生。
    11. event PropertyChangedEventHandler PropertyChanged;
    12. }
    13. }

    核心DataSource容器:ObservableCollection继承自Collection,位于System.Collections.ObjectModel命名空间下

    使用过程:

    ①Model类集成INotifyPropertyChanged接口,在成员属性的set方法中,将自身属性名称作为参数,触发事件PropertyChanged;

    ②使用Model实例对WPF用户控件(可为单个原生控件,或原生控件组合而成的自定义控件)的DataSource进行赋值,完成绑定,注意控件的UpdateSourceTrigger设置;

    ③或使用ObservableCollection实例对WPF容器控件的DataSource进行赋值,完成绑定;

    ④对Model类实例的属性进行更新,可在绑定了该实例的控件上观察到属性变化;

    ——很直观的,其本质是控件内部代码对PropertyChanged事件及其参数的处理

    Winform:

    核心接口:仍是INotifyPropertyChanged

    (容器控件)核心接口:IBindList

    用法大致同上,将ObservableCollection改为BindingList对Winform控件的DataSource进行赋值;

    ——(猜想本质)

    ①Model属性在后台代码中被赋值,将该属性名称作为参数PropertyChangedEventArgs触发PropertyChanged事件;

    ②并被进一步封装为ListChangedEventArgs触发容器类BindingList的ListChanged事件;

    ③而在OnListChanged的处理函数中,根据参数中的第一步的属性名称,通过类型为PropertyDescriptor(与其说是属性的基类,倒不如说是属性被封装后的集合)的SortPropertyCore属性检索到对应属性名改变后的值,并对控件进行重新绘制。

     单个控件(自定义控件后续了解后进行补充)

  • 相关阅读:
    《Python3 网络爬虫开发实战》:便于高效检索的 Elasticsearch 存储
    【生日快乐】SpringBoot SpringBoot 提高篇(第二篇) 第5章 SpringBoot 日志 5.3 SpringBoot 的日志使用
    赋值b=a、浅拷贝copy.copy()、深拷贝copy.deepcopy(a)
    手写代码模拟Spring底层原理
    技术分享 | 多测试环境的动态伸缩实践
    为什么要改变this指向?
    想要精通算法和SQL的成长之路 - 最长回文子串
    vue2踩坑之项目:Swiper轮播图使用
    【达梦数据库】如何使用idea antrl4插件方式dm sql
    淘宝/天猫关键词搜索采集接口分析商品价格走势(商品列表,商品销量,商品价格,分类ID采集精准商品数据)接口代码对接流程
  • 原文地址:https://blog.csdn.net/qq_23958061/article/details/126539524
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号