tnblog
首页
视频
资源
登录

WPF MvvmLight Messager学习

366人阅读 2025/4/17 11:35 总访问:3663651 评论:0 收藏:0 手机
分类: .net后台框架

.netcore

WPF MvvmLight Messager学习

NotificationMessage


在 MVVM Light 中,NotificationMessage 是一种消息类型,用于在 ViewModel 和 View 之间传递简单的通知消息。
以下是一个使用 NotificationMessage 的示例,展示如何在 ViewModel 中发送消息并在 View 中接收和处理这些消息

示例:使用 NotificationMessage 传递通知消息


1.在 MainViewModel 中,我们发送一个 NotificationMessage 消息。

  1. public class MainViewModel : ViewModelBase
  2. {
  3. public MainViewModel()
  4. {
  5. UpdateNameCommand = new RelayCommand(UpdateName);
  6. }
  7. private string _name;
  8. public string Name
  9. {
  10. get => _name;
  11. set => Set(ref _name, value);
  12. }
  13. public RelayCommand UpdateNameCommand { get; }
  14. private void UpdateName()
  15. {
  16. //发送消息给View端
  17. Messenger.Default.Send(new NotificationMessage("Hello NotificationMessage, MVVM Light!"));
  18. }
  19. }

注意这里有在ViewModelLocator中注册。


在 MainWindow.xaml中修改以下代码,创建一个按钮Update Name以及一个CC的文本框。

  1. <Window x:Class="WpfLearningMvvmlightApp.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:WpfLearningMvvmlightApp"
  7. mc:Ignorable="d"
  8. DataContext="{Binding Source={StaticResource Locator},Path=Main}"
  9. Title="MainWindow" Height="450" Width="800">
  10. <Grid Loaded="Grid_Loaded">
  11. <TextBlock Name="CC" Text="{Binding Name}" Margin="94,46,366,311" />
  12. <Button Content="Update Name" Command="{Binding UpdateNameCommand}" Margin="122,158,474,217" />
  13. <Button Content="测试" HorizontalAlignment="Left" Margin="453,185,0,0" VerticalAlignment="Top" Height="55" Width="160" Click="Button_Click_1"/>
  14. </Grid>
  15. </Window>


我们将注册通知消息,当我们收到通知时改变一下CC文本框的值

  1. public partial class MainWindow : Window
  2. {
  3. public MainWindow()
  4. {
  5. InitializeComponent();
  6. Messenger.Default.Register<NotificationMessage>(this, (message) =>
  7. {
  8. this.CC.Text = message.Notification;
  9. });
  10. }
  11. private void Grid_Loaded(object sender, RoutedEventArgs e)
  12. {
  13. }
  14. private void Button_Click_1(object sender, RoutedEventArgs e)
  15. {
  16. new SubWindow().Show();
  17. }
  18. }


当点击Update Name按钮的时候我们发现值被改变了。

NotificationMessageAction


在 MVVM Light 中,NotificationMessageAction 是一种消息类型,用于在 ViewModel 和 View 之间传递通知消息,并可以接收一个回调结果。
以下是一个使用 NotificationMessageAction 的示例,展示如何在 ViewModel 中发送消息并在 View 中接收和处理这些消息。

使用 NotificationMessageAction 传递通知消息


在 MainViewModel 中,我们发送一个 NotificationMessageAction 消息,并定义一个回调方法来处理消息的响应。

  1. private void UpdateName()
  2. {
  3. //Name = "Hello, MVVM Light!";
  4. //发送消息给View端
  5. //Messenger.Default.Send(new NotificationMessage("Hello NotificationMessage, MVVM Light!"));
  6. // 创建一个 NotificationMessageAction 并发送
  7. NotificationMessageAction<MessageBoxResult> message =
  8. new NotificationMessageAction<MessageBoxResult>(
  9. "这是一个通知消息", // 消息内容
  10. (result) => HandleNotificationResult(result) // 回调方法
  11. );
  12. Messenger.Default.Send(message);
  13. }
  14. private void HandleNotificationResult(MessageBoxResult result)
  15. {
  16. // 处理回调结果
  17. if (result == MessageBoxResult.OK)
  18. {
  19. Debug.WriteLine("Click OK!");
  20. }
  21. else if (result == MessageBoxResult.Cancel)
  22. {
  23. Debug.WriteLine("Click Cancel!");
  24. }
  25. }


在 MainWindow 中,我们注册 NotificationMessageAction 消息,并定义一个方法来处理消息。

  1. public MainWindow()
  2. {
  3. InitializeComponent();
  4. //Messenger.Default.Register<NotificationMessage>(this, (message) =>
  5. //{
  6. // this.CC.Text = message.Notification;
  7. //});
  8. // 注册 NotificationMessageAction 消息
  9. Messenger.Default.Register<NotificationMessageAction<MessageBoxResult>>(this, HandleNotificationMessage);
  10. }
  11. private void HandleNotificationMessage(NotificationMessageAction<MessageBoxResult> message)
  12. {
  13. // 显示消息框并获取用户响应
  14. MessageBoxResult result = MessageBox.Show(
  15. message.Notification, // 消息内容
  16. "通知", // 标题
  17. MessageBoxButton.OKCancel // 按钮
  18. );
  19. // 执行回调方法
  20. message.Execute(result);
  21. }


然后我们尝试一下,首先我们点击Update Name按钮,然后我们点OK,发现它有输出Click OK!

PropertyChangedMessage


PropertyChangedMessage<T> 是一种消息类型,用于在 ViewModel 和 View 之间传递属性值的变化。
以下是一个使用 PropertyChangedMessage<string> 的示例,展示如何在 ViewModel 中发送消息并在 View 中接收和处理这些消息。

示例:使用 PropertyChangedMessage 传递属性变化


在 MainViewModel 中,我们定义一个属性,并在属性值发生变化时发送 PropertyChangedMessage<string> 消息。

  1. public class MainViewModel : ViewModelBase
  2. {
  3. public MainViewModel()
  4. {
  5. UpdateNameCommand = new RelayCommand(UpdateName);
  6. _name = "BLBL";
  7. }
  8. private string _name;
  9. public string Name
  10. {
  11. get => _name;
  12. set
  13. {
  14. string oldvalue = _name;
  15. if (Set(ref _name, value))
  16. {
  17. // 发送属性变化消息
  18. Messenger.Default.Send(new PropertyChangedMessage<string>(oldvalue, _name, "Name"));
  19. }
  20. }
  21. }
  22. public RelayCommand UpdateNameCommand { get; }
  23. private void UpdateName()
  24. {
  25. // 初始化属性
  26. Name = "Initial Value";
  27. }
  28. private void HandleNotificationResult(MessageBoxResult result)
  29. {
  30. // 处理回调结果
  31. if (result == MessageBoxResult.OK)
  32. {
  33. Debug.WriteLine("Click OK!");
  34. }
  35. else if (result == MessageBoxResult.Cancel)
  36. {
  37. Debug.WriteLine("Click Cancel!");
  38. }
  39. }
  40. }


在 View 中,我们注册 PropertyChangedMessage<string> 消息,并处理属性变化。

  1. public MainWindow()
  2. {
  3. InitializeComponent();
  4. // 注册 NotificationMessageAction 消息
  5. Messenger.Default.Register<NotificationMessageAction<MessageBoxResult>>(this, HandleNotificationMessage);
  6. Messenger.Default.Register<PropertyChangedMessage<string>>(this, HandlePropertyChangedMessage);
  7. }
  8. private void HandlePropertyChangedMessage(PropertyChangedMessage<string> message)
  9. {
  10. if (message.PropertyName == "Name")
  11. {
  12. // 处理属性变化
  13. MessageBox.Show($"Property '{message.PropertyName}' changed from '{message.OldValue}' to '{message.NewValue}'");
  14. }
  15. }

DispatcherHelper帮助类


当我们需要做一些UI线程进行处理的时候,MVVMLight为我们提供了DispatcherHelper类进行支持,下面将会用一个简单的例子进行说明:
当有一个集合对象需要在前端进行显示的时候我们如果异步加载数据会报错,但是加上DispatcherHelperCheckBeginInvokeOnUI方法进行前端调用将没问题。
首先我们需要在MainViewModel类中添加集合对象。

  1. public MainViewModel()
  2. {
  3. UpdateNameCommand = new RelayCommand(UpdateName);
  4. _name = "BLBL";
  5. Task.Run(() => {
  6. for (int i = 0; i < 10; i++) {
  7. var temp = i;
  8. // 在非UI线程下添加集合对象会报错,MVVM给我们提供了这个方法来解决
  9. DispatcherHelper.CheckBeginInvokeOnUI(() => {
  10. OCValues.Add(temp);
  11. });
  12. }
  13. });
  14. }
  15. public ObservableCollection<int> OCValues { get; set; } = new ObservableCollection<int>();


我们还需要在App.cs类中,添加如下代码进行初始化DispatcherHelper

  1. public partial class App : Application
  2. {
  3. public App()
  4. {
  5. DispatcherHelper.Initialize();
  6. }
  7. }


然后在MainWindow.xaml中添加集合标签。

  1. <Window x:Class="WpfLearningMvvmlightApp.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:WpfLearningMvvmlightApp"
  7. mc:Ignorable="d"
  8. DataContext="{Binding Source={StaticResource Locator},Path=Main}"
  9. Title="MainWindow" Height="450" Width="800">
  10. <Grid Loaded="Grid_Loaded">
  11. <TextBlock Name="CC" Text="{Binding Name}" Margin="94,46,366,311" />
  12. <Button Content="Update Name" Command="{Binding UpdateNameCommand}" Margin="122,158,474,217" />
  13. <Button Content="测试" HorizontalAlignment="Left" Margin="122,258,0,0" VerticalAlignment="Top" Height="55" Width="160" Click="Button_Click_1"/>
  14. <ItemsControl ItemsSource="{Binding OCValues}" Margin="562,0,0,0">
  15. <ItemsControl.ItemTemplate>
  16. <DataTemplate>
  17. <TextBlock Text="{Binding}"/>
  18. </DataTemplate>
  19. </ItemsControl.ItemTemplate>
  20. </ItemsControl>
  21. </Grid>
  22. </Window>


当然我们也可以用Application的方式进行解决。

  1. Application.Current.Dispatcher.Invoke(() => { OCValues.Add(i); });


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Python学习 1-安装

Ptyhon非常简单易用的面向对象的脚本语言,跨平台 入门简单python分2个版本 Python2、Python3。Python 2.7 将于 2020 年结...

Python学习 2-基本语法

基础:python脚本语言,不需要编译(像C#、Java、PHP、C++需要编译成机器可识别的语言), 而直接由解释器解释,很多地方类似...

Python学习 3-爬虫基本介绍 及简单实例

爬虫爬虫就是一只猪,蜘蛛。。 网络蜘蛛。互联网是一个网由各个网站组成。无数的蜘蛛就在网上到处爬,根据网址从一个网站爬...

Java学习路线

第一部分:Java开发介绍1. DOS常用命令2. JVM、JRE、JDK之间的关系3. Java开发环境的搭建:安装JDK,配置环境变量4. Java入...

Java web学习路线

第二阶段:JavaWeb第一部分:HTML51. html概述2. html基本标签3. 图片标签4. 超链接标签5. 表格标签6. 无序列表标签7. 有序...

英语学习mark

英语语法:http://www.yingyuyufa.com中考翻译练习https://wenku.baidu.com/view/087e774030b765ce0508763231126edb6f1a76f...

css3样式学习代码

上代码!上代码!不说了&lt;!DOCTYPEhtml&gt; &lt;htmllang=&quot;en&quot;&gt; &lt;head&gt; &lt;metacharset=&quot;UT...

Java学习 - Java语言简介

java语言简介1.了解java产生的背景2.了解java体系结构和组成3.了解Java API文档的使用4.搭建java语言的开发环境(重点)5....

Java学习 - Java语言基础

Java语言基础1.Scanner的用法2.java的程序结构3.java的数据类型4.java的运算符和表达式5.程序流程控制6.数组一 Scanner的用...

MongoDB 学习一(包含各种花样坑)

资源链接:链接:https://pan.baidu.com/s/1xgDnP2aHW1fNN9qLAP7OtQ提取码:4zm81,安装MongoDB (传统式的下一步)这里选Cu...

Java学习 - 类和对象

1.了解面向对象和面向过程的区别 2.理解什么是类以及创建类的语法 3.理解什么是对象以及如何创建 4.掌握什么是封装一 面向...

Java学习 - 继承与多态

1.继承 2.多态 3.构造方法 4.重载 5.重写 6.super与this的区别 7.static,final,abstract的用法 8.接口一 什么是继承 如:...

vue.js 学习日记第一章-安装vue开发环境

官网:https://cn.vuejs.org/v2/guide/ 这是一篇学习性文章,不定时更新,用来记录我学习vue.js的过程。 首先,是v...

vue.js 学习日记第二章-在vue中编写function及一些简单指令

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第一章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第三章-vue中的简单事件及事件修饰符

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第二章:http://www.tnblog.net/18323015640/article/details/2...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术