关于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#事件总线攻略 事件总线是一种让不同对象之间相互通信的方式。它可以让多个对象在程序运行时相互协作,轻松实现松耦合(loose coupling)和高内聚(high cohesion)的编程状态。 事件总线的基础知识 事件总线是一个对象,它处理应用程序中的所有事件,并将它们发送给已经订阅这些事件的对象。这些对象被称为“事件订阅者”。 事件总线的实现方式 …

    C# 2023年6月6日
    00
  • C# zxing二维码写入的实例代码

    C# zxing是一个用于二维码的开源框架,它支持二维码的读取、生成,可用于各种应用场景,例如电子商务、物流信息追踪等。下面是C# zxing二维码写入的实例代码攻略: 1. 安装zxing库 首先需要安装zxing库,你可以从nuget包管理器中搜索zxing来安装。 2. 创建二维码编码器 BarcodeWriter writer = new Barco…

    C# 2023年5月31日
    00
  • PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用

    下面我会给您详细讲解 “PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用”的完整攻略。 一、什么是“重构”、“简化函数调用”的概念? 重构是指对既有代码进行修改,以改善其结构,使得代码更易于理解、更容易扩展、更符合设计模式等目的。 而简化函数调用,则是指通过改进函数的接口和参数列表,使得函数调用更为简洁、清晰可读。 二、如何进行函数调用的简化? 在…

    C# 2023年6月6日
    00
  • .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别介绍

    .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别介绍 在 .NET 生态系统中,有多个不同的平台和框架,包括 .NET Core、Xamarin、.NET Standard和.NET Framework。这些平台和框架之间有很多区别,本攻略将详细介绍它们之间的区别。 .NET Core .NET Co…

    C# 2023年5月17日
    00
  • C#四舍五入用法实例

    C#四舍五入用法实例攻略 本文将详细讲解C#中四舍五入的使用方法及应用场景。 四舍五入的用途 在实际开发中,我们需要处理浮点数,但是由于计算机的机器精度限制,运算中可能会产生精度误差。因此需要对浮点数进行四舍五入运算,以保证结果的精度。 Math.Round的用法 在C#中,我们可以使用Math.Round方法进行四舍五入运算。其语法如下: public s…

    C# 2023年6月7日
    00
  • js操作数据库实现注册和登陆的简单实例

    下面是关于“js操作数据库实现注册和登陆的简单实例”的完整攻略。 1. 准备工作 在开始操作数据库实现注册和登陆之前,需要进行以下准备工作: 安装 Node.js 以及相应的依赖模块。可以通过 npm 来安装依赖,具体的依赖包括 mysql、express、body-parser 等。这里以 mysql 和 express 为例进行说明,安装命令如下: ba…

    C# 2023年5月31日
    00
  • c# 泛型类型参数与约束的深入分析

    C# 泛型类型参数与约束的深入分析 泛型类型参数 C# 泛型是指在编译时不确定数据类型,而在运行时再确定数据类型的一种机制。可以通过泛型类型参数来定义泛型类型。泛型类型参数在定义泛型类型时作为占位符使用。 具体来说,泛型类型参数的格式如下所示: class MyGenericClass<T> { } 在上述代码中,<T> 就是一个泛型…

    C# 2023年6月7日
    00
  • 在.NET 6中使用日志组件log4net的方法

    以下是一个详细讲解“在.NET 6中使用日志组件log4net的方法”的完整攻略: 准备工作 在.NET 6项目中使用log4net日志组件,我们首先要准备好log4net包。可以在NuGet仓库中搜索“log4net”并安装。 配置文件 我们需要准备一个log4net的配置文件,来指定日志输出的文件、格式及其它相关属性。 在项目中添加一个名为“log4ne…

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