Prism 四事件聚合器

#1024程序员节|征文#

不废话,直接上代码一个简单的示例。

1、事件聚合

创建一个文件夹EventBLL,添加EventDemo.cs,代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WpfApp1.EventBLL
{public class EventDemo :PubSubEvent<string>{}
}

MainWindowViewModel.cs代码如下。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using WpfApp1.EventBLL;namespace WpfApp1.ViewModels
{public class MainWindowViewModel : BindableBase{private string _mvvmString = "Hello Prism";public string MVVMString{get { return _mvvmString; }set { SetProperty(ref _mvvmString, value); }}private IEventAggregator _eventAggregator;public MainWindowViewModel(IEventAggregator ea){_eventAggregator = ea;_eventAggregator.GetEvent<EventDemo>().Subscribe(GetEvent);}private void GetEvent(string str){MVVMString = "接收到:" + str;}private DelegateCommand _EventPublishCommand;public DelegateCommand EventPublishCommand{get { return _EventPublishCommand = new DelegateCommand(EventPublish); }}private void EventPublish(){_eventAggregator.GetEvent<EventDemo>().Publish("123");}}
}

MainWindow.xaml 修改代码如下。

<Window x:Class="WpfApp1.Views.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp1"xmlns:prism="http://prismlibrary.com/"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><StackPanel><TextBlock Text="{Binding MVVMString}" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center"/><Button Content="发布" Command="{Binding EventPublishCommand}" Width="200" Height="30" HorizontalAlignment="Center" Margin="0,0,0,5"/></StackPanel>
</Window>

运行效果如下图。

 2、订阅过滤

ThreadOption:下列选择可供选择。
    PublisherThread: 使用此设置接收发布者线程上的事件。这是默认设置。
    BackgroundThread: 使用此设置异步接收A上的事件。网框架线池线。
    UIThread: 使用此设置接收UI线程上的事件。

运行效果如图,通过下图可以看出当发布的是123是能够接收到。当发布的内容是23时没有接收到。这是因为订阅中过滤了不包含1的消息。

 MainWindow.xaml代码如下。

<Window x:Class="WpfApp1.Views.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp1"xmlns:prism="http://prismlibrary.com/"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><StackPanel><TextBlock Text="{Binding MVVMString}" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center"/><TextBox x:Name="tbMessage" HorizontalAlignment="Center" Width="200" Height="30"/><Button Content="发布" Command="{Binding EventPublishCommand}" CommandParameter="{Binding ElementName=tbMessage,Path=Text}" Width="200" Height="30" HorizontalAlignment="Center" Margin="0,0,0,5"/></StackPanel>
</Window>

 MainWindowViewModel.cs代码如下。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using WpfApp1.EventBLL;namespace WpfApp1.ViewModels
{public class MainWindowViewModel : BindableBase{private string _mvvmString = "Hello Prism";public string MVVMString{get { return _mvvmString; }set { SetProperty(ref _mvvmString, value); }}private IEventAggregator _eventAggregator;public MainWindowViewModel(IEventAggregator ea){_eventAggregator = ea;_eventAggregator.GetEvent<EventDemo>().Subscribe(GetEvent,ThreadOption.UIThread,false,(filter)=>filter.Contains("1"));}private void GetEvent(string str){MVVMString = "接收到:" + str;}private DelegateCommand<string> _EventPublishCommand;public DelegateCommand<string> EventPublishCommand{get { return _EventPublishCommand = new DelegateCommand<string>(EventPublish); }}private void EventPublish(string str){_eventAggregator.GetEvent<EventDemo>().Publish(str);}}
}

可以看到(filter)=>filter.Contains("1"),在这里对订阅进行了过滤,只有包含1的内容才能被接收到。

keepSubscriberReferenceAlive 参数是类型bool :

true ,事件实例保持对订阅实例的强引用,从而不允许它获得垃圾收集。
false(当此参数省略时的默认值),事件对订阅服务器实例保持弱引用,从而允许垃圾收集器在没有其他引用时处理订阅服务器实例。当收集订阅者实例时,事件将自动取消订阅。

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

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

相关文章

linux中级wed服务器(https搭建加密服务器)

一。非对称加密算法&#xff1a; 公钥&#xff1a;公共密钥&#xff0c;开放 私钥&#xff1a;私有密钥&#xff0c;保密 1.发送方用自己的公钥加密&#xff0c;接受方用发送方的私钥解密&#xff1a;不可行 2.发送方用接受方的公钥加密&#xff0c;接受方用自己的私钥解密…

SpringMVC实战:构建高效表述层框架

文章目录 1. SpringMVC简介和体验1.1 介绍1.2 主要作用1.3 核心组件和调用流程1.4 快速体验 2. SpringMVC接收数据2.1 访问路径设置2.2 接收参数2.2.1 param和json参数比较2.2.2 param参数接收2.2.3 路径参数接收2.2.4 json参数接收 2.3 接收cookie数据2.4 接收请求头数据2.5 原…

【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

CryoEM - 冷冻电镜 基于深度学习的 从头重构(Ab-initio Reconstruction) 开源项目 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/143162494 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 来源于 CryoDragon 算法 冷冻电镜(CryoEM) 是一种成像方式,为蛋白质和…

AOT漫谈专题(第六篇): C# AOT 的泛型,序列化,反射问题

一&#xff1a;背景 1. 讲故事 在 .NET AOT 编程中&#xff0c;难免会在 泛型&#xff0c;序列化&#xff0c;以及反射的问题上纠结和反复纠错尝试&#xff0c;这篇我们就来好好聊一聊相关的处理方案。 二&#xff1a;常见问题解决 1. 泛型问题 研究过泛型的朋友应该都知道…

论文笔记:通用世界模型WorldDreamer

整理了WorldDreamer: Towards General World Models for Video Generation via Predicting Masked Tokens 论文的阅读笔记 背景模型实验 背景 现有的世界模型仅限于游戏或驾驶等特定场景&#xff0c;限制了它们捕捉一般世界动态环境复杂性的能力。针对这一挑战&#xff0c;本文…

qt QHBoxLayout详解

QHBoxLayout 是 Qt 框架中用于创建水平布局的类。它将子控件以横向的方式排列&#xff0c;并自动调整大小&#xff0c;以适应父窗口的尺寸变化。 重要方法 QHBoxLayout(QWidget *parent nullptr)&#xff1a;创建一个 QHBoxLayout 对象&#xff0c;并指定其父窗口部件。addWi…

【ArcGIS微课1000例】0125:ArcGIS矢量化无法自动完成面解决方案

文章目录 一、坐标系统问题二、正确使用自动完成面工具一、坐标系统问题 1. 数据库坐标系 arcgis矢量化的过程中,无法自动完成面,可能是因为图层要素没有坐标系造成的。双击数据库打开数据库属性,可以查看当前数据框的坐标系。 2. 图层坐标系 双击图层,打开图层属性,切…

深度学习——线性神经网络(五、图像分类数据集——Fashion-MNIST数据集)

目录 5.1 读取数据集5.2 读取小批量5.3 整合所有组件 MNIST数据集是图像分类中广泛使用的数据集之一&#xff0c;但是作为基准数据集过于简单&#xff0c;在本小节将使用类似但更复杂的Fashion-MNIST数据集。 import torch import torchvision from torch.utils import data fr…

前端零基础入门到上班:【Day3】从零开始构建网页骨架HTML

HTML 基础入门&#xff1a;从零开始构建网页骨架 目录 1. 什么是 HTML&#xff1f;HTML 的核心作用 2. HTML 基本结构2.1 DOCTYPE 声明2.2 <html> 标签2.3 <head> 标签2.4 <body> 标签 3. HTML 常用标签详解3.1 标题标签3.2 段落和文本标签3.3 链接标签3.4 图…

使用Python来下一场深夜雪

效果图&#xff1a;&#xff08;真实情况是动态的&#xff09; 完整代码&#xff1a; import turtle import random# 初始化画布 turtle.bgcolor("#001f3f") # 偏深蓝色的背景 turtle.title("下雪的画面") turtle.speed(0) turtle.hideturtle() turtle.t…

创建ODBC数据源SQLConfigDataSource函数的用法

网络上没有这个函数能实际落地的用法说明&#xff0c;我实践后整理一下&#xff1a; 1.头文件与额外依赖库&#xff1a; #include <odbcinst.h> #pragma comment(lib, "legacy_stdio_definitions.lib") 2.调用函数&#xff1a; if (!SQLConfigDataSourceW(…

集创赛比赛细则了解

一、赛道划分 数字与SOC设计 紫光展锐杯不推荐大家参加&#xff0c;设计比较复杂 Arm杯是芯片IP封装测试&#xff0c;在FPGA上做外部总线协议设计。 Robei杯是作为FPGA的应用背景&#xff0c;包括控制算法 平头哥杯是阿里旗下专注于VSC的平台。通过平头哥的平台实现专门的应用…

【C语言】控制台学生成绩管理系统

文章目录 C语言编程&#xff1a;学生成绩管理系统一、程序概述二、代码实现三、程序解释 C语言编程&#xff1a;学生成绩管理系统 在这篇文章中&#xff0c;我们将一起探讨如何使用C语言来创建一个简单的学生成绩管理系统。这个系统将允许用户输入学生数量、学号和成绩&#x…

Web刷题日记1---清风

[GDOUCTF 2023]EZ WEB 题目网站在NSSCTF 这个题目有一个新的知识点&#xff0c;对于我来说比较的少见吧&#xff0c;第一次遇见。em...是什么呢?后面再说 进入靶场&#xff0c;比较突兀&#xff0c;点了这个button后&#xff0c;提示flag在附近 查看源码&#xff0c;有提示…

react18中使用redux管理公共数据仓库实现数据immutable更新

Immutable.js出自Facebook&#xff0c;是最流行的不可变数据结构的实现之一。它实现了完全的持久化数据结构&#xff0c;使用结构共享。所有的更新操作都会返回新的值&#xff0c;但是在内部结构是共享的&#xff0c;来减少内存占用。Immutablejs官网 在上一篇介绍redux的文章&…

FFMPEG+Qt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频

FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频 文章目录 FFMPEGQt 实时显示本机USB摄像头1080p画面以及同步录制mp4视频1、前言1.1 目标1.2 一些说明 2、效果3、代码3.1 思路3.2 工程目录3.3 核心代码 4、全部代码获取 1、前言 本文通过FFMPEG(7.0.2)与Qt(5.13.…

有色行业测温取样机器人 - SNK施努卡

SNK施努卡有色行业熔炼车间机器人测温取样 在有色行业&#xff0c;测温取样机器人专门设计用于自动化处理高温熔体的温度监测和样品采集任务。这类机器人在铜、铝、锌等金属冶炼过程中扮演着关键角色&#xff0c;以提高生产效率、确保产品质量并增强工作安全性。 主要工作项 …

基于 matlab 计算 TPI(地形位置指数)

1. TPI 简介 地形位置指数算法由 Weiss 提出&#xff0c;主要是根据局部地形高程对各类地貌单元提取。 其基本原理为&#xff1a;在邻域分析方法的基础上&#xff0c;计算每个栅格的高程值和该栅格领域内所有栅格的平均高程之间的差值&#xff0c;正值表示该栅格点高于领域内栅…

element ui中el-image组件查看图片的坑

比如说上传组件使用el-image-viewer组件去看&#xff0c;如果用错了&#xff0c;你会发现&#xff0c;你每次只能看一张图片 <template><div><el-upload action"#" list-type"picture-card" :auto-upload"false" :file-list"…