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隨時都有可能發生修改。要么就是每次事件之后修改,要么就給每個可能會觸發的屬性添加通知。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712613.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712613.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712613.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024年【A特種設備相關管理(電梯)】考試總結及A特種設備相關管理(電梯)證考試

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2024年A特種設備相關管理&#xff08;電梯&#xff09;考試總結為正在備考A特種設備相關管理&#xff08;電梯&#xff09;操作證的學員準備的理論考試專題&#xff0c;每個月更新的A特種設備相關管理&#xff08;電梯…

KVM部署Windriver Linux操作系統

安裝前準備 創建密碼配置文件&#xff0c;否則虛機啟動后無法登錄 cd /var/lib/libvirt/images/disks/windriver/ docker run -ti --rm quay.io/coreos/mkpasswd --methodyescrypt 123456 >password_hash.txt cat <<-ENDOF> sample.bu variant: fcos version: 1.4…

面試 Java 基礎八股文十問十答第十二期

面試 Java 基礎八股文十問十答第十二期 作者&#xff1a;程序員小白條&#xff0c;個人博客 相信看了本文后&#xff0c;對你的面試是有一定幫助的&#xff01;關注專欄后就能收到持續更新&#xff01; ?點贊?收藏?不迷路&#xff01;? 1&#xff09;創建一個對象用什么關…

代碼隨想錄day27:貪心part1,基礎篇

文章目錄 day27&#xff1a;貪心part1&#xff0c;基礎篇455.分發餅干376.擺動序列53.最大子數組和 day27&#xff1a;貪心part1&#xff0c;基礎篇 455.分發餅干 循環結束條件注意餅干比孩子多的情況 class Solution {public int findContentChildren(int[] g, int[] s) {A…

C++:非靜態成員默認初始化

C11之前只有常靜態成員變量才能進行默認初始化&#xff0c;其它變量初始化時總要進行繁瑣的過程 class A{int a; public:A():a(10){} };C11開始支持非靜態成員的默認初始化&#xff0c;默認初始化和初始化參數列表同時初始化一個變量時會使用初始化參數列表&#xff0c;不進行…

JavaScript new、apply call 方法

new、apply、call、bind JavaScript 中的 apply、call和 bind 方法是前端代碼開發中相當重要的概念&#xff0c;并且與 this 的指向密切相關 new new 關鍵詞的主要作用 就是執行一個構造函數、返回一個實例對象 根據構造函數的情況&#xff0c;來確定是否可以接受參數的傳遞…

Huggingface初上手即ERNIE-gram句子相似性實戰

大模型如火如荼的今天&#xff0c;不學點語言模型&#xff08;LM&#xff09;相關的技術實在是說不過去了。只不過由于過往項目用到LM較少&#xff0c;所以學習也主要停留在直面——動眼不動手的水平。Huggingface&#xff08;HF&#xff09;也是現在搞LM離不開的工具了。 出于…

最新 DataGrip 2023.3.4 下載安裝激活 + 永久免費

文章目錄 DataGrip簡介同類產品對比使用技巧不足實戰 下載安裝激活Stage 1 : 官網下載Stage 2 : 下載工具Stage 3-1 : windows為例Stage 3-2 : mac為例常見問題部分小伙伴 Mac 系統執行腳本遇到如下錯誤&#xff1a;解決方法&#xff1a; 執行腳本做了啥&#xff1f;和收費版區…

基于springboot+vue的可盈保險合同管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

XUbuntu22.04之如何找到.so庫所在的軟件包?(二百一十六)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…

Vue中的事件總線(EventBus)是什么?它有什么優點和缺點?

作為一名使用Vue的前端開發者&#xff0c;有時候會聽到事件總線(EventBus)這個名詞。但可能是我入行比較晚&#xff0c;我在Vue網站中并沒有看到過事件總線的介紹&#xff0c;在項目中也沒有使用過。那究竟什么是事件總線&#xff1f;事件總線可以解決什么問題&#xff1f; 事…

element-plus表格合并

要實現這樣的表格&#xff0c; 怎么做呢&#xff1f; 甚至是這種三級的呢&#xff1f; 官網的案例也是通過這個方法進行配置的&#xff0c;也就是說表格長什么樣&#xff0c;關鍵在怎么處理的方法上。 這是官網的方法&#xff0c;可參考拓展&#xff1a; const arraySpanMeth…

一款云滲透工具 - Sea Moon

SeaMoon - 月海 什么是月海 &#x1f315; 月出于云卻隱于海 月海(Sea Moon) 是一款 FaaS/BaaS 實現的 Serverless 網絡工具集&#xff0c;期望利用云原生的優勢&#xff0c;實現更簡單、更便宜的網絡功能。 月海之名取自于蘇軾的《西江月頃在黃州》&#xff0c;寓意月海取自…

【JVM】JVM相關機制

1. JVM內存區域劃分 1.1 內存區域劃分簡介 內存區域劃分&#xff1a;實際上JVM也是一個進程&#xff0c;進程運行時需要向操作系統申請一些系統資源&#xff08;內存就是典型的資源&#xff09;&#xff0c;這些內存空間就支撐著后續Java程序的運行&#xff0c;而這些內存又會…

Python環境搭建:一站式指南

在當前AIGC技術蓬勃發展的背景下&#xff0c;Python作為人工智能領域最受青睞的編程語言之一&#xff0c;成為我們必須掌握的技能。因此&#xff0c;搭建一個適合自己的Python環境成為了每個Python開發者的首要任務。本文將為您提供一站式的Python環境搭建指南&#xff0c;幫助…

PythonOpenCV隨機粘貼圖像

import cv2 import numpy as np import random # 讀取兩個圖像 image1 cv2.imread(image1.jpg) image2 cv2.imread(image2.jpg) # 將image1轉換為灰度圖像 gray_image1 cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) # 創建掩碼&#xff0c;黑色部分為0&#xff0c;非黑色部…

Python自動發郵件

我經常需要用手機看服務器的運行情況&#xff0c;所以就寫一個腳本&#xff0c;通過郵件把服務器運行情況發送給我&#xff0c;直接手機可以查看煉丹狀態。事實證明還是很有用的&#xff0c;所以撰寫一篇博文將腳本分享給大家。這里用到smtplib和email兩個python包。 import s…

力扣精選算法100道——顏色分類(雙指針和三指針倆種方法解決此題)

目錄 &#x1f6a9;了解題意 &#x1f6a9;算法分析 第一種方法&#xff1a;雙指針 &#x1f6a9;代碼實現一 第二種方法&#xff1a;三指針 &#x1f6a9;代碼實現二 &#x1f6a9;了解題意 本題將整數0&#xff0c;1&#xff0c;2代表紅白籃&#xff0c;nums中的整數并…

仿牛客網項目---私信列表和發送列表功能的實現

這篇文章我們來講一下我的這個項目的另外一個功能&#xff1a;私信列表和發送列表功能。 先來設計DAO層。 Mapper public interface MessageMapper {// 查詢當前用戶的會話列表,針對每個會話只返回一條最新的私信.List<Message> selectConversations(int userId, int of…

【激光SLAM】基于已知位姿的構圖算法 (Grid-based)

文章目錄 地圖分類概念 覆蓋柵格建圖算法柵格地圖的特征數學描述假設 算法流程激光雷達的逆觀測模型 計數(Count Model)建圖算法概念數學描述觀測模型地圖估計 地圖分類 概念 地圖即為環境的空間模型。環境地圖是機器人進行定位和規劃的前提。定位可以用特征地圖&#xff08;…