List和ObservableCollection和ListBinding在MVVM模式下的对比

news2025/1/21 18:58:26

List和ObservableCollection和ListBinding在MVVM模式下的对比

List

当对List进行增删操作后,并不会对View进行通知。

//Employee
public class Employee : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;
    public string Name { get; set; }
    private int salary;
    public int Salary
    {
        get { return salary; }
        set
        {
            salary = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Salary)));
        }
    }
}
<!--View-->
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="40" />
    </Grid.RowDefinitions>
    <DataGrid ItemsSource="{Binding Employees}" />
    <StackPanel
        Grid.Row="1"
        VerticalAlignment="Center"
        Orientation="Horizontal">
        <Button Command="{Binding addCommand}" Content="Add" />
        <TextBlock Text="工资总额" />
        <TextBox Text="{Binding TotalSalary, Mode=OneWay}" />
    </StackPanel>
</Grid>
//MainViewModel
public partial class MainViewModel:INotifyPropertyChanged
{
    public List<Employee> Employees { get; }
    public int TotalSalary=>Employees.Sum(x => x.Salary);

    
    public MainViewModel()
    {
        Employees = new List<Employee>() { 
            new Employee(){Name="Tom",Salary=200},
            new Employee(){Name="Tim",Salary=450},
            new Employee(){Name="Jerry",Salary=780},
            new Employee(){Name="Jake",Salary=540},
            new Employee(){Name="Kit",Salary=670},
        };
        
    }
    [RelayCommand]
    private void add()
    {
        Employees.Add(new Employee() {  Name = "Lit", Salary = 260 });
        //通知TotalSalay
        PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(nameof(TotalSalary)));
    }

    public event PropertyChangedEventHandler? PropertyChanged;
}

334

可以看到,点击Add后,上面列表中并没有更新,但是工资总额已经更新,这说明新的数据已经加到了List中,但是List并没有通知View。

ObservableCollection

  • ObservableCollection可以在增加和删除时,对View进行通知

    修改MainViewModel

    public partial class MainViewModel:INotifyPropertyChanged
    {
        public ObservableCollection<Employee> Employees { get; }
        public int TotalSalary=>Employees.Sum(x => x.Salary);
    
        
        public MainViewModel()
        {
            Employees = new ObservableCollection<Employee>() { 
                new Employee(){Name="Tom",Salary=200},
                new Employee(){Name="Tim",Salary=450},
                new Employee(){Name="Jerry",Salary=780},
                new Employee(){Name="Jake",Salary=540},
                new Employee(){Name="Kit",Salary=670},
            };
            
        }
        [RelayCommand]
        private void add()
        {
            Employees.Add(new Employee() {  Name = "Lit", Salary = 260 });
            PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(nameof(TotalSalary)));
        }
        //增加一个Modify方法
        [RelayCommand]
        private void Modify()
        {
            Employees[2].Salary = 999;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TotalSalary)));
        }
    
        public event PropertyChangedEventHandler? PropertyChanged;
    }
    

    335

    可以发现,点击Add,View中也相应地进行了更新,而且工资总额也相应改变。同时,无论是add还是Modify,都使用了PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TotalSalary)));它的改进做法是使用CollectionChanged事件。

//改进做法,增加CollectionChanged,可以删除add()和Modify()的PropertyChanged...了
Employees.CollectionChanged += (_, _) => { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TotalSalary))); };

BindingList

BindingList提供了更多的功能,提供了排序、搜索、过滤等功能。此外,BindingList 还提供了对数据源的更多控制,如 AllowNew、AllowEdit 和 AllowRemove 属性,用于控制是否允许添加、编辑和删除项。

BindingList提供了ListChanged事件,该事件参数中提供了详细的信息,但是ObservableCollection 是线程安全的,可以在多个线程中使用。而 BindingList 不是线程安全的,如果需要在多个线程中使用,需要进行额外的线程同步处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/883685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware vCenter 低版本存在未授权任意文件读取漏洞

VMware vCenter 低版本存在未授权任意文件读取漏洞,Arbitrary File Read vulnerability in VMware vCenter(Unauthenticated)。 Poc from:https://twitter.com/ptswarm/status/1316016337550938122 Name :VMware vCenter Server Arbitrary File Read Vulnerability Categor…

STM32F4X NVIC中断概念

STM32F4X NVIC中断概念 CPU查询状态两种方式轮询查询中断查询 STM32有关中断的概念中断向量表系统中断外设中断中断号中断优先级 STM32F4X NVIC控制器NVIC控制器简介NVIC寄存器优先级分组 STM32F4X中断配置优先级分组设置配置外设中断 CPU查询状态两种方式 在讲解中断的概念之…

软件测试常用工具总结(测试管理、单元测试、接口测试、自动化测试、性能测试、负载测试等)

前言 在软件测试的过程中&#xff0c;多多少少都是会接触到一些测试工具&#xff0c;作为辅助测试用的&#xff0c;以提高测试工作的效率&#xff0c;使用好了测试工具&#xff0c;能对测试起到一个很好的作用&#xff0c;同时&#xff0c;有些公司&#xff0c;也会要求掌握一…

docker 学习--03 环境安装(本人使用的win10 Linux也是在win10下模拟)

docker 学习–03 环境安装&#xff08;本人使用的win10 Linux也是在win10下模拟&#xff09; 文章目录 docker 学习--03 环境安装&#xff08;本人使用的win10 Linux也是在win10下模拟&#xff09;[TOC](文章目录) 1. windows10 安装docker1.1 访问官网 点击下载1.2.点击下载的…

算法通关村第九关 | 有序数组转搜索二叉树

有序数组转搜索二叉树 二叉搜索树概念&#xff1a; 若它的左子树不为空&#xff0c;则左子树上的所有节点的值均小于它根节点的值&#xff1b; 若它的右子树不为空&#xff0c;则右子树上所有节点的值均大于它的根节点的值&#xff1b; 它的左右子树也分别为二叉树。下面给出…

ORB_SLAM3 Relocalization

Relocalization Relocalization主要的作用是在跟踪失败时&#xff0c;通过词袋在关键帧数据库KeyFrameDatabase中寻找和当前帧相似的关键帧作为匹配帧&#xff0c;进而恢复当前帧的位姿 计算当前帧的Bow&#xff0c;参考ORB_SLAM3 TrackReferenceKeyFrame中计算当前帧的描述子…

【SLAM】ORBSLAM34macOS: ORBSLAM3 Project 4(for) macOS Platform

文章目录 配置ORBSLAM34macOS 版本运行步骤&#xff1a;版本修复问题记录&#xff1a;编译 fix运行 fix 配置 硬件&#xff1a;MacBook Pro Intel CPU 系统&#xff1a;macOS Ventura 13.4.1 ORBSLAM34macOS 版本 https://github.com/phdsky/ORB_SLAM3/tree/macOS 运行步骤&…

TALKS:解决模型-数据差异的系统框架

资料收集于网络&#xff0c;仅供学习使用 TALKS: A systematic framework for resolving model-data discrepancies https://doi.org/10.1016/j.envsoft.2023.105668 问题现状 TALKS框架 TALKS(Trigger, Articulate, List, Knowledge elicitation, Solve)&#xff0c;作为解…

SpringBoot引入外部jar打包失败解决,SpringBoot手动引入jar打包war后报错问题

前言 使用外部手动添加的jar到项目&#xff0c;打包时出现jar找不到问题解决 处理 例如项目结构如下 引入方式换成这种 <!-- 除了一下这两种引入外部jar&#xff0c;还是可以将外部jar包添加到maven中&#xff08;百度查&#xff09;--><!-- pdf转word --><…

时间序列数据的预处理方法总结

时间序列数据随处可见&#xff0c;要进行时间序列分析&#xff0c;我们必须先对数据进行预处理。时间序列预处理技术对数据建模的准确性有重大影响。 在本文中&#xff0c;我们将主要讨论以下几点&#xff1a; 时间序列数据的定义及其重要性。 时间序列数据的预处理步骤。 构…

opencv实现以图搜图

这里写目录标题 1. 步骤1.1 导入OpenCV库&#xff1a;1.2 加载图像1.3 提取特征1.4 匹配特征1.5 显示结果 2. 完整代码3. 测试图片及效果 1. 步骤 1.1 导入OpenCV库&#xff1a; 在您的C代码中&#xff0c;首先需要导入OpenCV库。您可以使用以下语句导入核心模块&#xff1a;…

【第三阶段】kotlin语言的安全调用操作符

&#xff1f;. fun main() {var name:String?"kotlin" //name是一个可空类型&#xff0c;发出广播&#xff0c;调用的地方必须补救措施namenullvar r name?.capitalize() //?. 如果namenull&#xff0c;那么?.的将不执行&#xff0c;就不会引发空指针异常prin…

多线程学习和Thread类

多线程的创建使用和Thread类 一、多线程相关概念1. 并行与并发2. 进程与线程3. 多线程的作用4. 线程调度 二、多线程创建使用1.经典的两种方式2. 匿名内部类实现3 Thread类3.1 构造器3.2 基本方法3.3 线程控制方法3.4 守护线程 三、 线程的生命周期四、线程安全方式1&#xff1…

hive-无法启动hiveserver2

启动hiveserver2没有反应&#xff0c;客户端也无法连接( beeline -u jdbc:hive2://node01:10000 -n root) 报错如下 查看hive的Log日志&#xff0c;发现如下报错 如何解决 在hive的hive_site.xml中添加如下代码 <property><name>hive.server2.active.passive…

8年测试经验之谈 —— JMeter生成HTML性能测试报告

1.修改JMeter的配置文件 2.配置环境变量 3.控制台到测试脚本目录并执行命令 4.查看测试报告 1.修改JMeter的配置文件 在JMeter本地安装目录下&#xff0c;把bin目录下jmeter.properties文件中的jmeter.save.saveservice.output_formatcsv禁⽤取消 # legitimate values: xml…

涨薪加薪利器:聊聊Synchronized和Volatile的差异究竟何在?

大家好&#xff0c;我是小米&#xff01;今天&#xff0c;我们要聊一个在Java多线程编程中非常重要的话题&#xff1a;Synchronized和Volatile的区别。这两个关键字常常令人迷惑&#xff0c;但却是我们编写高效、稳定多线程程序不可或缺的工具。废话不多说&#xff0c;让我们一…

Redis专题-队列

Redis专题-队列 首先&#xff0c;想一想 Redis 适合做消息队列吗&#xff1f; 1、消息队列的消息存取需求是什么&#xff1f;redis中的解决方案是什么&#xff1f; 无非就是下面这几点&#xff1a; 0、数据可以顺序读取 1、支持阻塞等待拉取消息 2、支持发布/订阅模式 3、重…

Vue 批量注册组件

全局组件 在components文件夹下新建一个Gloabl文件夹&#xff08;可以自行命名&#xff09; 在目录下新建index.js import Vue from vue// require.context(路径, 是否遍历子目录, 匹配规则) const requireComponents require.context(./, true, /\.vue/)requireComponents.k…

常见的前端对数据的操作方法

[{"name": "蒸汽锅炉 A 年度检验报告","sort": 5,"analysisComponent": "组件类型","trHeadVOList": [],"trContentVOList": [{"jieguo": "√","jianyanxiangmu": "…

神经网络分类算法的应用及其实现

目录 神经网络分类算法的应用及其实现 神经网络算法特点 1) 黑盒算法 2) 数据量 3) 算力和开发成本高 神经网络算法应用 神经网络分类算法的应用及其实现 神经网络算法特点 我们知道&#xff0c;深度学习的本质就是神经网络算法&#xff08;深度学习是神经网络算法的一个…