WPF 【十月的寒流】学习笔记(2):MVVM中是怎么实现通知的

文章目录

  • 前言
  • 相关链接
  • 代码仓库
  • 项目配置
  • 代码
    • 初始代码
      • View
      • Person
      • ViewModel
    • 尝试老办法通知
    • 解决方案
      • ObservableCollection
      • BindingList
      • ICollectionView
  • 总结

前言

我们这次详细了解一下列表通知的底层是怎么实现的

相关链接

十月的寒流

在这里插入图片描述
在这里插入图片描述

MVVM实战技巧之:可被观测的集合(ObservableCollection & BindingList)

代码仓库

我为了方便展示源代码,我将代码提交到了代码仓库里面

B站【十月的寒流】对应课程的代码 Github仓库

项目配置

如何使用我这里就不展开说明了

WPF CommunityToolkit.Mvvm

WPF CommunityToolkit.Mvvm Messenger通讯

在这里插入图片描述

WPF-UI HandyControl 简单介绍

WPF-UI HandyControl 控件简单实战+IconPacks矢量图导入

在这里插入图片描述

Bogus,.NET生成批量模拟数据
在这里插入图片描述

代码

初始代码

View

 <UserControl.DataContext>
     <viewModels:DemoViewModel />
 </UserControl.DataContext>
 <DockPanel>
     <StackPanel DockPanel.Dock="Bottom">
         <Button Command="{Binding AddItemCommand}"
                 Content="添加数据"></Button>

     </StackPanel>
     <DataGrid ItemsSource="{Binding People}"></DataGrid>
 </DockPanel>

Person

public class Person
{
    public int Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName { get; set; }

    public DateOnly BirthDay { get; set; }

    public static Person FakerOne => faker.Generate();

    public static IEnumerable<Person> FakerMany(int count)=>faker.Generate(count);

    private static readonly Faker<Person> faker = new Faker<Person>()
        .RuleFor(t=>t.Id,f=>f.IndexFaker)
        .RuleFor(t=>t.FirstName,f=>f.Name.FirstName())
        .RuleFor(t=>t.LastName,f=>f.Name.LastName())
        .RuleFor(t=>t.FullName,f=>f.Name.FullName())
        .RuleFor(t=>t.BirthDay,f=>f.Date.BetweenDateOnly(new DateOnly(1990,1,1),new DateOnly(2010,1,1)));
}

ViewModel

public partial class DemoViewModel:ObservableObject
{
    [ObservableProperty]
    private List<Models.Person> people = new List<Models.Person>();

    [RelayCommand]
    public void AddItem()
    {
        People.Add(Models.Person.FakerOne);
    }

    public DemoViewModel() {
        People = Models.Person.FakerMany(5).ToList();
    }

   
}

现在的代码是没有实现通知,点击按钮也不会添加

在这里插入图片描述

尝试老办法通知

        public void AddItem()
        {
            People.Add(Models.Person.FakerOne);
            //没有效果
            //OnPropertyChanged(nameof(People));

            //没有效果
            //SetProperty(ref people, people);
        }

而且在我们点击ListBox的时候,会报错。这个就说明,其实List已经修改了,但是这个通知方法不行。原因是List指向的是一个地址空间,这个地址空间并没有变化。
在这里插入图片描述

解决方案

ObservableCollection

简单的解决方案就是改成ObservableCollection,这里就不展开说明了。
在这里插入图片描述
但是有一个问题,这个ObservableCollection只在Count更新的时候触发自动更新。里面的Person值修改的时候是不会触发更新的。

如果有联动更新的需求,可以直接在【CollectionChanged】添加对应的代码
在这里插入图片描述

BindingList

这里我就不展开说明了,直接上视频的源代码了。

在这里插入图片描述
在这里插入图片描述

ICollectionView

WPF 【十月的寒流】学习笔记(1):DataGrid过滤

更好的解决方案就是直接更新。我们直接刷新ItemSorce

<UserControl x:Class="WpfMvvmDemo.Views.DemoView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:WpfMvvmDemo.Views"
             xmlns:viewModels="clr-namespace:WpfMvvmDemo.ViewModels"
             mc:Ignorable="d"
             d:DesignHeight="450"
             d:DesignWidth="800">
    <UserControl.DataContext>
        <viewModels:DemoViewModel />
    </UserControl.DataContext>
    <DockPanel>
        <StackPanel DockPanel.Dock="Bottom"
                    HorizontalAlignment="Left"
                    Orientation="Horizontal">
            <Button Command="{Binding AddItemCommand}"
                    Margin="5"
                    Content="添加数据"></Button>
            <Button Command="{Binding UpIdCommand}"
                    Margin="5"
                    Content="增加Id"></Button>
        </StackPanel>
        <DataGrid ItemsSource="{Binding PeopleView}"></DataGrid>
    </DockPanel>
</UserControl>

using Bogus;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace WpfMvvmDemo.ViewModels
{
    public partial class DemoViewModel:ObservableObject
    {
        [ObservableProperty]
        private List<Models.Person> people = new List<Models.Person>();

        [ObservableProperty]
        private ICollectionView peopleView;

        [RelayCommand]
        public void AddItem()
        {
            People.Add(Models.Person.FakerOne);
            //没有效果
            //OnPropertyChanged(nameof(People));

            //没有效果
            //SetProperty(ref people, people);

            //直接更新整个视图源
            PeopleView.Refresh();
            
        }
        [RelayCommand]
        public void UpId()
        {
            foreach (var item in People)
            {
                item.Id += 10;
            }
            PeopleView.Refresh();
        }

        public DemoViewModel() {
            People = Models.Person.FakerMany(5).ToList();
            PeopleView = CollectionViewSource.GetDefaultView(People);
        }

       
    }
}

为了方便,我们也可以直接新建一个类,这里就把代码放一下,就不展开说明了

    public class CollectionData<T> where T : class
    {

        public IEnumerable<T> Data { get; set; }

        public ICollectionView CollectionView { get; set; }
        public CollectionData() { }

        public void Init()
        {
            CollectionView = CollectionViewSource.GetDefaultView(Data);
            CollectionView.Refresh();
        }
    }

总结

我觉得当时【十月的寒流】那个视频一直在想用MVVM去通知更新,当然他的主题也是使用MVVM自动更新。但是ItemSorce随时都有可能发生修改。要么就是每次事件之后修改,要么就给每个可能会触发的属性添加通知。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解Java中的优先级队列(堆)——PriorityQueue

引言&#xff1a; 在Java中&#xff0c;优先级队列&#xff08;PriorityQueue&#xff09;是一种基于堆结构实现的队列&#xff0c;其中每个元素都有一个优先级&#xff0c;优先级高的元素在队列中具有更高的优先级&#xff0c;排在前面。优先级队列常用于任务调度、事件处理等…

js 面试运行机制和存储(从以下几方面理解),栈和堆的理解

1 工作原理 每个浏览器都有自己的引擎&#xff0c;通过引擎把代码解析运行起来。 2 生命周期 3-1 内存分配 3-2 内存使用 3-3 内存回收 3 栈和堆的理解 timer也是个函数--所以也是引用类型。 4 如何运行 以下可忽略 首先声明变量&#xff0c;放在左侧栈中执行&#xff0c;在执行…

MATLAB环境下一种新颖的类脉冲信号的高分辨率时频分析方法

一般情况下&#xff0c;机械振动信号或地震信号是非平稳的。而传统傅立叶变换只能应用于平稳信号分析&#xff0c;故不适用于非平稳信号。所以&#xff0c;我们需要采用时频分析方法。时频分析方法能达到同时在时间域和频率域对信号进行分析的目的&#xff0c;得到信号在不同时…

makefileGDB使用

一、makefile 1、make && makefile makefile带来的好处就是——自动化编译&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0c;极大的提高了软件开发的效率 下面我们通过如下示例来进一步体会它们的作用&#xff1a; ①…

从预训练到通用智能(AGI)的观察和思考

1.预训练词向量 预训练词向量&#xff08;Pre-trained Word Embeddings&#xff09;是指通过无监督学习方法预先训练好的词与向量之间的映射关系。这些向量通常具有高维稠密特征&#xff0c;能够捕捉词语间的语义和语法相似性。最著名的预训练词向量包括Google的Word2Vec&#…

(2024,MixLoRA,任务干扰,独立因子选择,条件因子选择)使用 LoRA 的条件混合进行多模态指令调优

Multimodal Instruction Tuning with Conditional Mixture of LoRA 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 任务干扰在多模态指令调优中的 LoRA 应用 3.1 背景&am…

深度神经网络联结主义的本质

一、介绍 在新兴的人工智能 (AI) 领域&#xff0c;深度神经网络 (DNN) 是一项里程碑式的成就&#xff0c;突破了机器学习、模式识别和认知模拟的界限。这一技术奇迹的核心是一个与认知科学本身一样古老的思想&#xff1a;联结主义。本文深入探讨了联结主义的基本原理&#xff0…

Nodejs 第四十三章(redis)

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据结构存储系统&#xff0c;它提供了一个高效的键值存储解决方案&#xff0c;并支持多种数据结构&#xff0c;如字符串&#xff08;Strings&#xff09;、哈希&#xff08;Hashes&#xff09;、列表&a…

React之组件定义和事件处理

一、组件的分类 在react中&#xff0c;组件分为函数组件和class组件&#xff0c;也就是无状态组件和有状态组件。 * 更过时候我们应该区别使用无状态组件&#xff0c;因为如果有状态组件会触发生命周期所对应的一些函数 * 一旦触发他生命周期的函数&#xff0c;它就会影响当前项…

X-pin扁线电机制造工艺复杂 联合电子率先实现其量产

X-pin扁线电机制造工艺复杂 联合电子率先实现其量产 扁线电机是扁平铜包线绕组的电机。扁线电机是目前主流电机绕组形式&#xff0c;根据技术路线不同&#xff0c;扁线电机分为I-pin扁线电机、Hair-pin扁线电机、X-pin扁线电机等&#xff0c;其中X-pin扁线电机是指采用X-pin绕组…

utniy urp shinyssrr插件使用

文章目录 前言步骤1首先在URP的配置文件里添加SSR后处理2 修改RenderingPath为延迟渲染3 启用深度纹理4 为物体添加脚本 插件下载 前言 用来实现屏幕空间反射效果 unity 版本为2021.3.8LTS&#xff0c;低版本的untiy URP的参数设置位置z可能会不同 步骤 1首先在URP的配置文件…

专访win战略会任志雄:澳门旅游业复苏 挖掘游客消费潜力

南方财经:各个国家地区的客商都有不同文化背景和消费习惯,应如何更好吸引外地客商来澳门? win战略会任志雄:首先,周边国家的市场潜力都非常大,包括韩国、日本、越南和印度。 这些年来,这些国家的经济增长都很高,居民的出游比重也在持续增加,如果他们国家的居民把澳门作为一个重…

初学JavaWeb开发总结

0 什么是Web开发 Web: 全球广域网&#xff0c;又称万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 Web开发&#xff0c;就是开发网站的&#xff0c;如&#xff1a;淘宝、京东等等。 1 网站的工作流程 流程&#xff1a; 浏览器先向前端服务器请求前端资…

一文看清楚流程自定义表单究竟好不好用

提升办公协作效率、做好数据资源利用率的话&#xff0c;可以用什么样的软件实现&#xff1f;在低代码技术平台领域奋斗多年&#xff0c;流辰信息服务商可以给大家推荐专用的流程自定义表单及低代码技术平台整套服务方案。如果你想知道流程自定义表单好不 好用&#xff0c;有什么…

idc业务具体包含哪些业务

IDC业务&#xff0c;即互联网数据中心业务&#xff0c;是指提供互联网基础设施服务的一种商业模式。它包括了许 多不同的业务&#xff0c;每个业务都有其特定的功能和用途。下面将详细介绍IDC业务具体包含哪些业务。 1. 服务器托管服务&#xff1a; 服务器托管是IDC业务中最基…

transformer--解码器

在编码器中实现了编码器的各种组件&#xff0c;其实解码器中使用的也是这些组件&#xff0c;如下图&#xff1a; 解码器组成部分: 由N个解码器层堆叠而成每个解码器层由三个子层连接结构组成第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接第二个子层连…

<专利>机器人3D视觉快速定位抓取方法及系统

摘要&#xff0c;此专利无可用的关键技术信息&#xff0c;基本都是下面几句话反复说。。。 本发明提供了一种机器人3D快速定位抓取方法及系统&#xff0c; 包括&#xff1a; 通过高速的3D结构光成像对目标物体的表面轮廓进行扫描&#xff0c; 形成点云数据&#xff1b;对所述点…

浅谈排序算法(冒泡,插入,归并)

对于数据的排序&#xff0c;有多种方法&#xff0c;对应这不同的时间复杂度&#xff08;效率不同&#xff09;。 ​一、冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。 算法思路&#xff1a; 1. 从第一对相…

利用 Python 抓取数据探索汽车市场趋势

一、引言 随着全球对环境保护意识的增强和技术的进步&#xff0c;新能源汽车作为一种环保、高效的交通工具&#xff0c;正逐渐受到人们的关注和青睐。在这个背景下&#xff0c;对汽车市场的数据进行分析和研究显得尤为重要。 本文将介绍如何利用 Python 编程语言&#xff0c;结…

扭蛋机小程序开发,线上扭蛋机成为市场发展主流?

近几年以来&#xff0c;潮玩市场一直处于领先状态&#xff0c;市场规模逐渐扩大。在潮玩行业中&#xff0c;除了盲盒&#xff0c;受到各大群体喜欢的就是扭蛋机了&#xff0c;它因为价格低、品类多样、收藏价值高的优势吸引了各个群体的消费者。 当下&#xff0c;线上用户体量…