首页 > 其他分享 >关于ObservableCollection的更新与不更新分析

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

时间:2023-05-06 22:33:40浏览次数:53  
标签:ObservableCollection Students 更新 students 关于 集合 public

因为最近在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

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

标签:ObservableCollection,Students,更新,students,关于,集合,public
From: https://www.cnblogs.com/cbaa/p/17378609.html

相关文章

  • 2022最简单方法更新华为鸿蒙3.0系统HarmonyOS 3.0安装谷歌服务框架GMS谷歌应用商店Goo
    原视频:https://www.youtube.com/watch?v=AsAiuMKXOQYGbox谷歌框架官方下载地址:https://www.gboxlab.com/Gbox谷歌框架带谷歌应用商店的旧版本下载:https://www.mediafire.com/file/sj0l50pogpjwjnb/GBox-release-1.3.20.apk/file......
  • 关于伪代码和表格宽度的设置 Latex
    伪代码设置首先是伪代码的包跟algorithm相关的包有以下几个algorithmalgorithmicalgorithmicxalgorithm2e最早出现的algorithm+algorithmic第二个环境algorithm+algorithmicx第三个环境algorithm2e其次是伪代码的格式参照这篇(20条消......
  • 关于Kubernetes-v1.23.6-初始化时报错[WARNING FileExisting-tc]: tc not found in sy
    今天笔者在部署Kubernetes-v1.23.6版本时,在对master节点使用如下命令进行初始化时,报错:[WARNINGFileExisting-tc]:tcnotfoundinsystempath当然其实也从字符意义上来看,只能算是WARNING提醒,不会影响主要的功能和结果,但既然有这个提醒,就可能就在某些地方是有轻微影响的,为了......
  • 【CS】客户端更新(一)——更新程序文件方式
    一、前言      最近接手了个半CS半BS的项目。怎么说呢?由于项目比较紧张,而且BS的项目已经做出来了,虽说不是很好,但是也可以满足增删改查的操作。但是CS的项目比较紧,给了一个月的时间,如果每个功能都做的话,时间根本不够,就算时间够,资金也不够。所以就在CS的界面中调用了BS的界面,然......
  • 关于 “无法启动此程序,因为计算机中丢失mfc140.dll,尝试重新安装该程序已解决此问题”
      这个问题花了很久的时间百度,后来终于理解了dll文件的作用。VC运行库有必要下吗?VC++运行库有什么用?vc运行库里面包含的dll和ocx文件可以确保很多软件能够正常运行,因为有很多软件是用VC++语言编写的,那么在运行的时候也需要相应的运行库支持,下面系统之家小编来详细介绍一下V......
  • C#一行代码之跨线程更新控件1
    代码使用ThreadPool.QueueUserWorkItem(o=>{for(inti=0;i<100;i++){textBox1.ExInvokeIt(textBox=>textBox.Text=i.ToString());}});//或Task.Run(()=>{for(inti=0;i<100;i++){textBox1.E......
  • 聊聊关于,SpringBoot写后端接口
    前言:一个后端接口大致分为四个部分组成:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响应数据(response)。如何构建这几个部分每个公司要求都不同,没有什么“一定是最好的”标准,但一个优秀的后端接口和一个糟糕的后端接口对比起来差异还是蛮大的,其中最重要的关键点就是......
  • 关于 class helper for ... 语法
    classhelper可能是从Delphi2007增加的新语法, Txxx=classhelperforT...{T...表示已存在的类}{可以替换已存在的方法}{也可以有新的方法、成员}end;//这之后再使用T...类及其子孙类时,都会优先使用Txxx的修改.例一:unitUnit1;interfaceusesWindow......
  • 5-关于JavaEE的版本
    JavaEE目前最高版本是JavaEE8JavaEE被Oracle捐献了,Oracle将JavaEE规范捐献给Apache了。Apache把JavaEE换名了,以后不叫JavaEE了,以后叫做jakartaEE。以后没有JavaEE了。以后都叫做JakartaEE。JavaEE8版本升级之后的"JavaEE9",不再是"JavaEE9"这个名字了,叫做JakartaEE9Java......
  • [软件人生]关于同行竞业,你需要知道,你需要关注后续
    在昨天进行的我与软通动力下属灵动公司之间的同行竞业禁止仲裁中,对方律师就坚持一条:两家公司营业执照上登记的经营范围相同,所以,存在同行竞业禁止。完全无视两家公司处于两个完全不同的行业,产品完全不同的事实,坚持要求我赔偿50多万元同行竞业禁止赔偿金。结束的时候,这位盈科律师事务......