关于ObservableCollection的更新与不更新分析

这篇具有很好参考价值的文章主要介绍了关于ObservableCollection的更新与不更新分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

因为最近在WPF项目中,遇到ObservableCollection这个属性的频繁使用,一个一个坑跳过来,今天看到这个贴子

玩转INotifyPropertyChanged和ObservableCollection - 包建强 - 博客园 (cnblogs.com)

其中分析很透彻了,但是留了一点遗憾,而且在其中引起了一个想法,做一个项目来测试一下。

我们知道在Binding一个item的时候,想要其中属性变化时,UI同步变化,需要实现OnPropertyChanged接口,我因为习惯于mvvm.Toolkit,也就是说需要继承ObservableObject,

类似这样:

 public class Student:ObservableObject
    {
        private string name;
        public string Name
        {
            get => name;
            set => SetProperty(ref name, value);
        }
        private int age;
        public int Age
        {
            get => age;
            set=>SetProperty(ref age, value);
        }
}

在Binding到集合项的时候,通常需要这样

pulic  ObservableCollection<Student> Students_t = new ();

通过上面2条,可以实现:集合中增加、删除元素,及元素属性更新的时候,UI可自动更新。

但是,但是的但是,如果需要刷新数据的时候,比如说,人工清除当前集合,重新从源头读取,通常这样:

Students=new ObservableCollection<Student>(ctx.students)

这就坏了,发现UI没更新。原因在于,ObservableCollection只关注内部的元素变化,但当他自己发生了变化,其实对集合Binding关系已经破坏了,因为这是一个新建的集合,等于更新了Students这个对象,而不是对这个对象的内部元素作出的增删。

希望我说得明白了。

如果我说明白了,就是说,前面我们忽略了一个问题。

Students仍然不是可观察对象。

所以,要修改为

 private ObservableCollection<Student> students_c = new ();
public ObservableCollection<Student> Student_c
        {
            get => students_c;
            set => SetProperty(ref students_c, value);
        }
}

开始我说的忽发奇想是,如果我对List<T>实现可观察,是否能够代替了ObservableCollection?测试结果是,是的,在重置数据的时候,确实是可以实现的(很奇怪吗?),但是在增删元素的时候,仍然不行,仍然需要ObservableCollection。

对以上各种情况,我做的测试项目,见:

https://gitee.com/ppcba/observable-collection-demo.git

如果有同样疑惑的,建议参考着自己做一下,不然会仍然糊涂着。

==========2023-5-7补充=========

ObservableCollection的重置还有一种场景,就是自身不带AddRange方法,只好更新它后面的数据源,习惯上是这样使用的:

StuList.AddRange(stus);
Students=New ObservableCollection<Student>(StuList);

这就使得ObservableCollection被重置了。

所以,我现在项目上,仍然把ObservableCollection作为字段,而不是属性,需要重置的时候,就清空,然后使用扩展方法AddRange方法。

但从MVVM强迫症的角度,还是一切OnPropertyChanged进行到底为好。文章来源地址https://www.toymoban.com/news/detail-435236.html

到了这里,关于关于ObservableCollection的更新与不更新分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ChatGPT之后,下个AIGC杀手级应用已近在眼前

    鱼羊 发自 凹非寺 量子位 | 公众号 QbitAI 大模型模式,正在新一波AIGC的浪潮里被再度验证。 从AI画画的出圈,到现如今ChatGPT的火爆,面向大众的爆款产品接口背后,无不是大模型技术的突破创新。 而当这种“大力出奇迹”的技术路径价值愈发凸显,行业内外也不禁好奇:

    2024年02月10日
    浏览(48)
  • 【数据结构与算法分析】使用C语言实现队列的两种(带头结点与不带头结点)链式存储,并且给出一种循环队列的设计思想

      当我们编写程序时,经常需要处理各种数据结构。队列是一种常见的数据结构,它有着广泛的应用场景。队列的基本操作包括入队和出队,应用于模拟等待队列、消息队列、计算机缓存等场合。   在实际编程中,我们可以用不同的数据结构来实现队列。本文主要介绍了

    2024年02月08日
    浏览(118)
  • 韩媒评UDC大会:区块链行业刮“环保之风”,TRON为最环保的企业

    9月23日,韩国备受关注的全球区块链会议“Upbit Developer Conference”(简称UDC)正式结束,大会以“想象你的区块链生活”为主题,汇聚了包括孙宇晨等在内的区块链领域的数十位领军人士,就“NFT”、“元宇宙”以及“Web 3.0”等区块链热点趋势进行了深入探讨。 当日,韩国知

    2024年01月23日
    浏览(51)
  • 可观测集合 ObservableCollection<T>、BindingList<T>

    WPF中经常使用的是集合类型,数据条目经常按集合类型进行保存收纳,当我们向用户公开一些命令:添加、删除或刷新整个列表,如何通知界面进行准确的刷新呢?这时我们就需要使用可被观测的集合 ObservableCollectionT、BindingList 一个动态数据集合,该集合在添加或删除项或刷

    2024年02月19日
    浏览(20)
  • List和ObservableCollection和ListBinding在MVVM模式下的对比

    List 当对List进行增删操作后,并不会对View进行通知。 可以看到,点击Add后,上面列表中并没有更新,但是工资总额已经更新,这说明新的数据已经加到了List中,但是List并没有通知View。 ObservableCollection ObservableCollection 可以在增加和删除时,对View进行通知 修改MainViewModel 可以

    2024年02月12日
    浏览(33)
  • 关于Apache ANT(更新中)

    ANT,是Another Neat Tool的意思,字面意思可以叫“另一个整洁的工具”。英文单词ant是蚂蚁的意思。 可以用命令行启动Ant。 开发Ant的和开发Tomcat的是同一个软件工程师,他叫James Duncan Davidson。一开始Ant是James自己用于编译Tomcat的时候用的,Ant只是Tomcat部署的一部分。 直到2000年

    2023年04月09日
    浏览(17)
  • import时加{}与不加的区别

    在JavaScript中,使用 import 语句导入模块时,加上花括号 {} 与不加的区别在于: 不加花括号:导入整个模块对象。例如, import axios from \\\'axios\\\' 会导入整个 axios 模块,可以通过 axios.get() 等方法来使用它。 加上花括号:只导入模块中的指定变量或函数。例如, import { get, post }

    2024年02月16日
    浏览(38)
  • 【前后端分离与不分离的区别】

    Web 应用的开发主要有两种模式: 前后端不分离 前后端分离 理解它们的区别有助于我们进行对应产品的测试工作。 在早期,Web 应用开发主要采用前后端不分离的方式,它是以后端直接渲染模板完成响应为主的一种开发模式。以前后端不分离方式开发的 Web 应用的架构图如下

    2024年01月21日
    浏览(32)
  • 关于Windows更新页面显示错误的可能解决办法

    如果你使用过联想关闭windows自动更新软件,而现在发现windows更新显示错误,或者下载不了windows可选服务或语言包之类(都是因为连接不上windows服务器),那么这篇文章很可能对你有用。 一.首先请你检查一下自己的windows服务。 1.先点击“开始”右键,点击“计算机管理”

    2024年02月06日
    浏览(65)
  • 关于Microsoft Store无法更新的解决方案

    20230324 By wdhuag 最近莫名其妙的,Microsoft Store更新一直报错,能正常进入。网上搜到的DNS、hosts、重置商店、Internet 选项基本没有效果。 Microsoft store无法安装以及更新应用,怎么解决? - 简书 能进入windows store 却不能下载软件? - 知乎 win10应用商店无法下载应用的问题 0x80D02

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包