关于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.cnblogs.com/cbaa/archive/2023/05/06/17378609.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于ObservableCollection的更新与不更新分析 - Python技术站

(0)
上一篇 2023年5月7日
下一篇 2023年5月7日

相关文章

  • C#如何提取经纬度文件中的经纬度数据

    下面是C#如何提取经纬度文件中的经纬度数据的攻略。 准备工作 首先,我们需要安装GeoCoordinate.Net这个NuGet包,它提供了计算经纬度距离、方向等相关的操作,方便我们在处理经纬度数据时使用。 在Visual Studio中,可以通过在“解决方案资源管理器”中右键点击项目,选择“管理NuGet程序包”的方式来安装。 获取文件中的经纬度数据 接下…

    C# 2023年5月15日
    00
  • 如何在C#项目中链接一个文件夹下的所有文件详解

    当我们需要在C#项目中链接一个文件夹下的所有文件时,可以通过以下方式实现: 在 Visual Studio 中创建 C# 项目。选择 “File” > “New” > “Project”,然后选择 “Visual C#” > “Windows” > “Console Application”。 在项目中添加文件夹。右键项目,选择 “A…

    C# 2023年6月1日
    00
  • .NET几种微服务框架,你用过吗?

    最近有群友问,.NET有哪些微服务框架?.NET的微服务框架还真不多,一般企业都会自己搭建微服务框架,或者基于其它框架搭建微服务(比如abp)。本文将介绍几种微服务框架,供大家学习参考。 一、Service Fabric 简介: Service Fabric 是一个微服务框架,它由微软开发并托管在 Azure 上。它提供了一种分布式系统的方式,允许开发人员在…

    C# 2023年5月11日
    00
  • C#基于Socket套接字的网络通信封装

    C#基于Socket套接字的网络通信封装 本文将介绍如何使用C#基于Socket套接字的网络通信封装进行网络编程,包括创建Socket、连接服务器、传输数据等操作。 创建Socket 在C#中,使用Socket类来创建Socket。其中SocketType指定了Socket的类型(Stream、Dgram、Raw等),ProtocolType指定了使用的协议…

    C# 2023年6月6日
    00
  • C#实现平衡查找树

    C# 实现平衡查找树的完整攻略如下: 什么是平衡查找树 平衡查找树也称 AVL 树,是一种非常高效的数据结构,用于存储和查找有序的数据,平衡查找树的特点是保证了树的高度始终是 O(log n),这样可以在 O(log n) 时间内查找任何一个元素。平衡查找树常用于数据库索引、文件系统和网络路由器中等需要高效查找的场景。 平衡查找树的实现 平衡查找树的实现需要…

    C# 2023年6月8日
    00
  • asp.net中C#实现手动回收内存的方法

    ASP.NET是一种使用C#语言编写的web应用开发框架。在该框架下,进行内存回收的方法也是使用C#语言来实现的。以下是实现手动回收内存的方法攻略: 1. 使用GC类进行内存回收 步骤一:导入GC类 using System; 步骤二:调用GC.Collect方法进行内存回收 GC.Collect(); 以上代码会强制执行垃圾回收,并释放当前应用程序中所有未…

    C# 2023年5月31日
    00
  • c# 闭包的相关知识以及需要注意的地方

    C#中闭包是一种特殊的函数,它捕获了外部函数或方法的变量,并在外部函数或方法被调用或执行完毕后,仍可以访问外部函数或方法中的变量。闭包在某些情况下可以使代码更加简洁、优雅和高效,但也存在一些需要注意的地方。 什么是闭包? 闭包是指一个函数捕获了外部函数或方法中的变量,并将其作为该函数的一部分返回。通常情况下,当一个函数或方法执行完毕后,其中的局部变量就会被销…

    C# 2023年6月7日
    00
  • C#实现求一组数据众数的方法

    要实现求一组数据的众数,可以采用以下步骤: 步骤一:读入数据 首先要将一组数据读入程序中,可以使用数组、列表等数据结构来存储数据。 示例代码: int[] data = { 2, 3, 2, 4, 5, 2, 1 }; 步骤二:找出出现次数最多的数 通过遍历数组或列表,统计每个数出现的次数,并记录出现次数最多的数。 示例代码: int maxCount = …

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部