WPF:ViewModel和ViewModel之间的消息交互
WPF:ViewModel和ViewModel之间的消息交互
打开了两个视图,一个视图是用户信息列表,一个视图是用户信息添加页面,如果想要达到添加信息之后,用户信息列表视图实时刷新,用消息通知无疑是一个很棒的体验。
首先看一下流程
发送的MessengerSenderViewModel代码如下:
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using GalaSoft.MvvmLight.Messaging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MessengerInfo.ViewModel
{
public class MessengerSenderViewModel : ViewModelBase
{
public MessengerSenderViewModel()
{
}
#region 属性
private String sendInfo;
/// <summary>
/// 发送消息
/// </summary>
public String SendInfo
{
get { return sendInfo; }
set { sendInfo = value; RaisePropertyChanged(() => SendInfo); }
}
#endregion
#region 命令
private RelayCommand sendCommand;
/// <summary>
/// 发送命令
/// </summary>
public RelayCommand SendCommand
{
get
{
if (sendCommand == null)
sendCommand = new RelayCommand(() => ExcuteSendCommand());
return sendCommand;
}
set { sendCommand = value; }
}
private void ExcuteSendCommand()
{
Messenger.Default.Send<String>(SendInfo, "Message");
}
#endregion
}
}
MessengerSenderView 代码如下:
using MessengerInfo.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace MessengerInfo
{
/// <summary>
/// MessengerSenderView.xaml 的交互逻辑
/// </summary>
public partial class MessengerSenderView : Window
{
public MessengerSenderView()
{
InitializeComponent();
this.DataContext = new MessengerSenderViewModel();
}
}
}
<Window x:Class="MessengerInfo.MessengerSenderView"
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:MessengerInfo"
mc:Ignorable="d"
Title="MessengerSenderView" Height="300" Width="300">
<Grid>
<StackPanel Orientation="Horizontal" Margin="10,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" >
<TextBox Text="{Binding SendInfo}" Width="150" ></TextBox>
<Button Command="{Binding SendCommand}" Content="发送消息" Margin="15,0,0,0"></Button>
</StackPanel>
</Grid>
</Window>
接收的MessengerRegisterViewModel 代码如下:
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using GalaSoft.MvvmLight.Messaging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MessengerInfo.ViewModel
{
public class MessengerRegisterViewModel : ViewModelBase
{
public MessengerRegisterViewModel()
{
///Messenger:信使
///Recipient:收件人
Messenger.Default.Register<String>(this, "Message", ShowReceiveInfo);
}
#region 属性
private String receiveInfo;
/// <summary>
/// 接收到信使传递过来的值
/// </summary>
public String ReceiveInfo
{
get { return receiveInfo; }
set { receiveInfo = value; RaisePropertyChanged(() => ReceiveInfo); }
}
#endregion
#region 启动新窗口
private RelayCommand showSenderWindow;
public RelayCommand ShowSenderWindow
{
get
{
if (showSenderWindow == null)
showSenderWindow = new RelayCommand(() => ExcuteShowSenderWindow());
return showSenderWindow;
}
set { showSenderWindow = value; }
}
private void ExcuteShowSenderWindow()
{
MessengerSenderView sender = new MessengerSenderView();
sender.Show();
}
#endregion
#region 辅助函数
/// <summary>
/// 显示收件的信息
/// </summary>
/// <param name="msg"></param>
private void ShowReceiveInfo(String msg)
{
ReceiveInfo += msg + "\n";
}
#endregion
}
}
MessengerRegisterView 代码
using GalaSoft.MvvmLight.Messaging;
using MessengerInfo.ViewModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace MessengerInfo
{
/// <summary>
/// MessengerRegisterView.xaml 的交互逻辑
/// </summary>
public partial class MessengerRegisterView : Window
{
public MessengerRegisterView()
{
InitializeComponent();
this.DataContext = new MessengerRegisterViewModel();
//卸载当前(this)对象注册的所有MVVMLight消息
this.Unloaded += (sender, e) => Messenger.Default.Unregister(this);
}
}
}
<Window x:Class="MessengerInfo.MessengerRegisterView"
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:MessengerInfo"
mc:Ignorable="d"
Title="MessengerRegisterView" Height="300" Width="300">
<Grid>
<StackPanel Orientation="Vertical" HorizontalAlignment="Left" VerticalAlignment="Top" >
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="15,15,0,0" >
<TextBlock Text="接收消息:" ></TextBlock>
<TextBlock Text="{Binding ReceiveInfo}" FontSize="18" TextWrapping="Wrap" ></TextBlock>
</StackPanel>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="15,15,0,0" >
<Button Content="打开子窗口" Command="{Binding ShowSenderWindow}" ></Button>
</StackPanel>
</StackPanel>
</Grid>
</Window>