首页 > 其他分享 >WPF笔记12——List<T> 与 ObservableCollection<T>

WPF笔记12——List<T> 与 ObservableCollection<T>

时间:2024-12-19 11:55:07浏览次数:4  
标签:OnPropertyChanged 12 List 视图 ObservableCollection 集合 new WPF

代码1,使用ObservableCollection<T>:

/*
优点:
  (1)使用ObservableCollection<Student>来存储学生数据。在WPF中,ObservableCollection是一个非常适合数据绑定的集合类型。
      当集合中的元素发生变化(如添加、删除、修改元素)时,它会自动通知UI更新,这符合MVVM模式下视图与视图模型之间数据绑定的需求,使得UI能够及时响应数据的变化.
  (2)在WPF开发中,ObservableCollection是处理动态数据集合的标准方式。使用它有助于编写更易于维护和扩展的代码,特别是在涉及到数据驱动的UI场景下,如显示学生列表并且列表可能会动态变化(例如添加新学生或删除现有学生)。

缺点:
  (1)ObservableCollection为了实现元素变更通知功能,会有一定的性能开销。如果应用场景中集合数据非常庞大,并且变更操作非常频繁,这种开销可能会对性能产生一定的影响。不过在大多数常规的WPF应用场景中,这种影响通常是可以接受的。
*/


using System.Collections.ObjectModel;
using System.ComponentModel;

public class StudentViewModel : INotifyPropertyChanged
{
    private ObservableCollection<Student> _students;

    public StudentViewModel()
    {
        _students = new ObservableCollection<Student>
        {
            new Student { Name = "John Doe", Age = 21 },
            new Student { Name = "Jane Smith", Age = 22 }
        };
    }

    public ObservableCollection<Student> Students
    {
        get => _students;
        set
        {
            _students = value;
            OnPropertyChanged(nameof(Students));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}	

代码2,使用List<T>:

/*
优点:
  (1)使用List<Student>是一种简单直接的方式来存储学生数据。List是C#中的基本集合类型,相比于ObservableCollection,它的性能在某些情况下可能更好,特别是在只需要进行简单的读取操作而不需要关注集合变更通知的场景下。
  (2)如果应用场景中不需要集合变更自动通知UI(例如数据只是一次性加载并且不会再发生改变),List是一个更简洁的选择。代码的逻辑相对简单,没有ObservableCollection为了实现变更通知而带来的额外复杂性。
缺点:
  (1)不支持自动数据绑定更新。
    在WPF的MVVM模式下,如果视图绑定到这个List类型的Students属性,当List中的元素发生变化(如添加、删除元素)时,UI不会自动得到通知进行更新。
    这就需要手动编写额外的代码来实现类似的功能,这违背了MVVM模式中视图和视图模型松耦合的原则,增加了代码的维护难度。

*/

using System.Collections.ObjectModel;
using System.ComponentModel;

public class StudentViewModel : INotifyPropertyChanged
{
    private List<Student> _students;

    public StudentViewModel()
    {
        _students = new List<Student>
        {
            new Student { Name = "John Doe", Age = 21 },
            new Student { Name = "Jane Smith", Age = 22 }
        };
    }

    public List<Student> Students
    {
        get => _students;
        set
        {
            _students = value;
            OnPropertyChanged(nameof(Students));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}	
  1. ObservableCollection<T>的特性

    • 自动通知机制ObservableCollection<T>是一个动态数据集合,它实现了INotifyCollectionChanged接口。
      这意味着当集合中的项被添加、删除或整个集合被重置时,它会自动触发CollectionChanged事件。
      例如,在一个WPF的用户界面中,如果一个ListView的数据绑定到一个ObservableCollection<string>,当向这个集合中添加一个新的字符串时,ListView会自动更新以显示新的内容,而不需要手动触发任何更新操作。
    • 与数据绑定的无缝集成:在WPF中,数据绑定是MVVM模式的核心部分。ObservableCollection<T>与数据绑定系统紧密配合,使得视图能够自动响应集合的变化。
      当使用List<T>结合OnPropertyChanged时,它只能通知属性(集合本身)的变化,比如当整个集合被替换时。
      但是如果只是集合中的一个元素被添加、删除或修改,List<T>不会自动通知视图更新。
      ObservableCollection<T>会在这些更细粒度的变化发生时,如AddRemoveInsert等操作,自动发出通知,使视图能够及时更新。
  2. List<T>结合OnPropertyChanged的局限性

    • 手动更新负担重:如果使用List<T>并通过OnPropertyChanged来通知变化,当对列表中的元素进行操作(如添加、删除或修改元素)时,需要在代码中手动触发OnPropertyChanged事件。
      例如,假设在视图模型中有一个List<string>属性MyList,在向MyList中添加一个新元素后,需要手动调用OnPropertyChanged("MyList")来通知视图更新。
      这种手动触发的方式容易出错,而且如果有多个地方对列表进行操作,很容易遗漏更新通知。
    • 只能通知集合整体变化OnPropertyChanged主要是用于通知属性值的改变。对于List<T>,它只能有效地通知视图当整个列表被重新赋值(例如MyList = new List<string>())这种情况。
      如果只是列表中的元素发生了变化,如MyList[0] = "New Value",视图不会自动更新,除非额外编写复杂的代码来处理这种元素级别的变化通知。
  3. 总结

    • 推荐使用ObservableCollection<T>是因为它提供了更方便、更自动的方式来处理集合的变化通知,减少了手动更新的工作量,并且能够更精细地与WPF的数据绑定系统协同工作,确保视图能够及时、准确地反映数据模型中的集合变化。这符合MVVM模式中视图和视图模型之间松耦合、自动更新的原则,提高了代码的可维护性和可读性。

标签:OnPropertyChanged,12,List,视图,ObservableCollection,集合,new,WPF
From: https://www.cnblogs.com/zeoHere/p/18616847

相关文章

  • 【2024-12-18】调整母亲的期望
    20:00一个人要保持勇气,须要从一切行为可以公开做起。这是第一着。第二件要不为劣等欲望之所牵制。                                                 ——XXX昨晚奶奶......
  • C#/.NET/.NET Core技术前沿周刊 | 第 17 期(2024年12.09-12.15)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等......
  • USACO备考冲刺必刷题 | P1218 Superprime Rib
    学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考学习过程中的题目,记录每一个瞬间。附上汇总贴:USACO备考冲刺必刷题|汇总-CSDN博客【题目描述】农民约翰的母牛总是产生最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。农民约翰确定他卖给买方......
  • 12.18学习内容
    目录1、三角形画法2、消除图片间留白2.1  图片大小独占一行时①给元素设display:block②给元素设浮动:float:left2.2  一行有多张图片时①给父级设font-size:0②给父级设display:flex③给元素设浮动:float:left3、蒙层4、超出文本显示“...”5......
  • RV1126平台下的MobileSeg量化指南:高效部署低算力硬件
    1引言MobileSeg系列模型采用编解码架构,并以轻量级模型作为骨干网络,专为低算力硬件(如BPU、NPU、ARMCPU等)设计。这使得MobileSeg在边缘设备和移动端应用中表现出色,具备高效能和灵活性。本文将以MobileSeg分割模型为例,详细讲解如何在RV1126平台上进行模型量化操作,最大化发挥......
  • 12.17夜发电实录
    1随便找寻一个日期消失不可思议的世界深浅未知的乐园与故乡哇,还有纯爱充电。耗电给自己充电充电耗电给自己充电温暖而拖沓的浅白色的背后没有扣子的旗袍与系带的灰烬一般的冬日2太好了,准备拿舌头去舔[em]e400365[/em][em]e400365[/em][em]e400365[/em][em]e400365[/......
  • 12月18号总结
    名称:混凝土承重等级预测在土木工程中,混凝土是构筑建筑物最基本的材料。混凝土可承受的强度与其寿命、制造所使用的材料、测试时的温度等因素息息相关。混凝土的制造过程十分复杂,涉及水泥、熔炉产出的煤渣和灰烬、水、强度塑化剂、粗聚合剂、细聚合剂等多种化工原料。我们用一个压......
  • 12月16日总结
    今天是周一已经考完了六级重心放在了期末的一些任务上,学习了数据流图画法数据流图(DataFlowDiagram,DFD)是描述数据流动经过系统的图形表示方法。它通常用于需求分析阶段,帮助理解系统的功能需求。以下是创建数据流图的基本步骤和画法:基本组成部分外部实体(又称为源点或终点):......
  • (12-8-03)基于CPM中英双语多模态大模型的文生图系统:模型微调(3)
    12.9.3 训练初始化文件initializer.py的功能是提供模型训练的初始化配置和加载工具,包括解析训练参数、设置分布式训练环境、加载预训练模型和分配器(LLM和VPM),并设置所需的文件路径和目录结构。通过这个文件,用户可以轻松配置模型并启动模型训练过程。logger=init_logger......
  • 1264. 页面推荐 - 力扣(LeetCode)
    1264.页面推荐-力扣(LeetCode)目标输入输入:朋友关系列表 user1_iduser2_id12131423242561输入:喜欢列表user_idpage_id188223324456511633277377688输出输出:推荐页面列表recommended_page2324563377分析编写解决方案,向user_id=1的用户,推荐其朋友们喜欢的页......