CommunityToolkit.Mvvm笔记---ObservableRecipient

ObservableRecipient 类型是可观察对象的基类,这些对象还充当消息收件人,是 ObservableObject 的扩展,它还对使用 IMessenger 类型提供内置支持。这使得在不直接引用其他组件的情况下,组件之间可以相互通信。在MVVM架构中,这对于ViewModel之间的解耦非常有用。

平台 API:ObservableRecipient、ObservableObject、IMessenger、WeakReferenceMessenger、IRecipient<TMessage>、PropertyChangedMessage<T>

 消息通信实例如下:

发送方ViewModel,继承ObservableRecipient

 public partial class F0InstructionPageViewModel : ObservableRecipient{public F0InstructionPageViewModel(){}[RelayCommand]private void OnNextPage(){Messenger.Send("hello");//WeakReferenceMessenger.Default.Send("hello WPF");// StrongReferenceMessenger.Default.Send("hello WPF");//以上发送消息方式均可}}

 发送方xaml

<StackPanel Grid.Row="1"><Button Command="{Binding Path=NextPageCommand }" Content="Next"></Button>
</StackPanel> 

有两种接收方式

方式一:

接收方ViewModel,信息可以绑定到xaml中

public partial class MainPageViewModel : ObservableRecipient
{[ObservableProperty]private string receivedMessage;public MainPageViewModel(){Messenger.Register<string>(this,(r,m) =>{ReceivedMessage = m;MessageBox.Show(ReceivedMessage);});}}

方式二:

 IRecipient<T>方式

接收方ViewModel,继承ObservableObject,IRecipient

 public partial class MainPageViewModel : ObservableObject, IRecipient<string>{public MainPageViewModel(){WeakReferenceMessenger.Default.Register(this);}[ObservableProperty]private string receivedMessage;public void Receive(string message){ReceivedMessage = message;MessageBox.Show(receivedMessage);}}

当不再需要某个接收者时,你应该注销它,使其停止接收消息。你可以通过消息类、注册令牌或接收者来注销它:

// Unregisters the recipient from a message type
WeakReferenceMessenger.Default.Unregister<LoggedInUserChangedMessage>(this);

// Unregisters the recipient from a message type in a specified channel
WeakReferenceMessenger.Default.Unregister<LoggedInUserChangedMessage, int>(this, 42);

// Unregister the recipient from all messages, across all channels
WeakReferenceMessenger.Default.UnregisterAll(this);
 

 注意:

如前面所述,当使用 WeakReferenceMessenger 时,上面的注销操作不是严格需要的,因为使用弱引用来追踪接收者意味着不用的接收者即使仍然有激活的消息处理程序,它们仍会被GC清理。不过,取消订阅它们仍然是一个好的做法,这可以提高性能。

另一方面,StrongReferenceMessenger 实现使用了强引用来跟踪注册的接收者。这样做是出于性能考虑,这意味着每个注册的接收者应该手动被注销以避免内存泄漏。也就是说,只要注册了一个接收者,使用中StrongReferenceMessenger实例就会保活对它的引用,这将防止GC回收该实例。你可以手动处理它,也可以从ObservableRecipient继承,当它被禁用时,默认情况下会自动删除所有接收者的消息注册。

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

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

相关文章

面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!

时间片 超线程 上下文切换 切换查看 线程调度 引起线程上下文切换的因素 由于现在大多计算机都是多核CPU&#xff0c;多线程往往会比单线程更快&#xff0c;更能够提高并发&#xff0c;但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、…

AI系列:大语言模型的function calling

目录 大语言模型(LLM) 的function calling实验&#xff1a;OpenAI之function calling序列图&#xff1a;function calling如何工作详情: 对话内容参考代码 后续: 使用LangChain实现function calling参考 大语言模型(LLM) 的function calling 大语言模型(LLM)可以使用自然语言与…

Android中的Context

前言 在Android开发中&#xff0c;当我们要创建或启动四大组件时&#xff0c;不能通过简单的new关键字实现&#xff0c;而是要通过他们的上下文环境&#xff0c;也就是我们要讨论的Context。 Android的应用模型是基于组件的应用设计模式&#xff0c;而组件的运行需要一个完整…

python数据结构与算法之线性表

1、线性表 是一种由n个元素&#xff08;n> 0 &#xff09;数据元素组成的有限序列&#xff0c;所包含的元素数量通常被称为表的长度 n 0 的表被称为空表&#xff0c;线性表的数据元素可以单一也可以复杂&#xff0c;可以是整数&#xff0c;字符串&#xff0c;也可以是由几…

c---内置函数模拟(memset,memcmp,memcpy,memmove)

void* my_memset(void* s1, int zifu, int num) {//引用string.h assert(s1); void* ret &s1; while (num--) { *(char*)s1 (char)zifu; s1 (char*)s1 1; } return ret; } int my_memcmp(const void* s1,const void* s2,int num)…

python_31-32

目录 1.进程 2.同步进程&#xff1a; 3.守护进程&#xff1a; 1.进程 # ### 进程 process import os,time""" # ps -aux 查看进程号 # ps -aux | grep 2784 过滤查找2784这个进程# 强制杀死进程 kill -9 进程号# 获取当前进程号 res os.getpid() print(res)…

进程间通信--管道

1.有名管道 管道的分类:有名管道和无名管道 有名管道也成为命名管道.区别:有名管道在任意两个进程之间通信,无名管道在父子进程之间通信. 1.创建有名管道使用命令:mkfifo 2.打开管道:open(); 关闭管道:close(); 读数据:read(); 写入数据:write(); 2.有名管道来演示进程间通信:…

高光谱遥感数据处理与机器学习深度应用

高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论&#xff0c;旨在帮助学员深入理解科学原理。结合Python编程工具&#xff0c;专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题&#xff0c;…

将自己的项目上传至Git

一、安装Git 官网:Git (git-scm.com) 二、注册gitee 官网:工作台 - Gitee.com 进入“我的”出现以下界面 三、创建仓库 点击加号&#xff0c;新建仓库 根据自己的需求取名&#xff0c;描述仓库&#xff0c;开源还是私有&#xff0c;点击创建即可&#xff0c;点击我的即可…

[docker] 核心知识 - 容器/镜像的管理和操作

[docker] 核心知识 - 容器/镜像的管理和操作 想要查看完整的指令&#xff0c;可以通过 docker --help 列举所有的指令&#xff0c;这里会提到一些比较常用的核心指令 查看容器的状态 这个应该是最常用的指令&#xff0c;语法为 docker ps&#xff0c; ps 为 process status …

RT-Thread时钟管理

操作系统需要通过时间来规范其任务,主要介绍时钟节拍和基于时钟节拍的定时器。 时钟节拍 任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。 RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_P…

图像识别在医疗诊断中的应用与价值

图像识别技术在医疗诊断中的应用与价值日益凸显&#xff0c;为医生提供了更为准确、高效的诊断工具。这种技术利用深度学习算法和神经网络模型对大量医学图像数据进行训练&#xff0c;从而实现对图像的准确识别和分类。 在医疗诊断中&#xff0c;图像识别技术主要应用于医学影…

代码随想录-算法训练营day08【字符串01:反转字符串、替换数字、反转字符串里的单词、右旋转字符串】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第四章 字符串part01今日任务 ● 344.反转字符串 ● 541. 反转字符串II ● 卡码网&#xff1a;54.替换数字 ● 151.翻转字符串里的单词 ● 卡码网&#xff1a;55.右旋转字符串详细布置 344.反转字符串 建议&#xff1a…

租用马来西亚服务器:稳定高效的网络选择

马来西亚首都是吉隆坡。作为一个新兴的多元化经济国家&#xff0c;也属于亚洲四小龙之一。地理位置优越&#xff0c;中间隔着南中国海。一部分是北接泰国的位于马来半岛的西马来西亚&#xff0c;另一部分则是东马来西亚&#xff0c;在婆罗洲岛的北部。这种地理位置有利于促进该…

IGBT退饱和现象解析与防范

IGBT是一种重要的功率半导体器件&#xff0c;广泛应用于电力电子领域&#xff0c;如变频器、电动机驱动、电力传输等。在这些应用中&#xff0c;IGBT的导通和关断特性至关重要&#xff0c;而退饱和是IGBT工作过程中的一个重要现象。 IGBT的退饱和定义 退饱和是指IGBT在导通状态…

Human Motion Diffusion Model 使用笔记

目录 依赖项&#xff1a; 依赖项目&#xff1a; 验证数据集 体验网址&#xff1a; 推理代码整理&#xff0c;一键运行 渲染mesh 可视化代码&#xff1a; GitHub - GuyTevet/motion-diffusion-model: The official PyTorch implementation of the paper "Human Moti…

WordPress用户福音:Elementor Pro国产版替代方案,全新中文界面更懂你

如果你正在考虑创建自己的网站&#xff0c;那么在第一次谷歌搜索时&#xff0c;你可能已经看到了WordPress、Elementor和网站构建器这些专业名称。WordPress是最受欢迎的网站平台之一&#xff0c;这不难理解&#xff1a;它高度可定制&#xff0c;易于学习&#xff0c;而且是免费…

java算法day55 | 动态规划part16 ● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 思路&#xff1a; 和1143.最长公共子序列这道题思路相同&#xff0c;只不过需要对return的数据做一些操作。 class Solution {public int minDistance(String word1, String word2) {int[][] dpnew int[word1.length()1][word2.length()1];for(int …

【Linux 驱动基础】设备树中断

# 前置知识 interrupts 文档 Specifying interrupt information for devices 1) Interrupt client nodes -------------------------Nodes that describe devices which generate interrupts must contain an "interrupts" property, an "interrupts-extende…

业务与数据的终极对决:如何让大数据成为企业的超能力?

在数字化转型的浪潮中&#xff0c;企业如同在茫茫数据海洋中航行的船只&#xff0c;而数据资产管理就是指引航向的罗盘。但是&#xff0c;当业务需求与数据脱节、数据孤岛林立、业务流程与数据流程不同步、以及业务增长带来的数据管理挑战成为阻碍&#xff0c;我们该如何突破重…