Install-Package CommunityToolkit.Mvvm
2.新建2个ViewModel通过Messenger进行通信
public class MainWindowViewModel : ObservableObject,IRecipient<UserLoginMessage>
{
private string receiveMsg = string.Empty;
public string ReceiveMsg
{
get { return receiveMsg; }
set { receiveMsg = value; OnPropertyChanged(); }
}
public IRelayCommand<string> ExecuteCommand { get; private set; }
public MainWindowViewModel()
{
ExecuteCommand = new RelayCommand<string>(ExecuteAction);
//注册
WeakReferenceMessenger.Default.Register<UserLoginMessage>(this);
}
~MainWindowViewModel()
{
//注销消息注册(弱引用可不使用)
WeakReferenceMessenger.Default.Unregister<Student>(this);
}
//View中按钮点击命令
private void ExecuteAction(string? actionName)
{
if (actionName == "MainToSend")
{
WeakReferenceMessenger.Default.Send(new Student { Name = "Stan", Age = 18 });
}
}
//接收数据
public void Receive(UserLoginMessage message)
{
ReceiveMsg = message.User;
}
}
public class SubViewModel : ObservableObject
{
private string _receive = string.Empty;
public string Receive
{
get { return _receive; }
set { _receive = value; OnPropertyChanged(); }
}
public IRelayCommand<string> ExecuteCommand { get; private set; }
public SubViewModel()
{
ExecuteCommand = new RelayCommand<string>(ExecuteAction);
//第二种Message注册方式
WeakReferenceMessenger.Default.Register<Student>(this, (r, m) =>
{
//接收数据
Receive = m.Name;
});
}
~SubViewModel()
{
//注销消息注册(弱引用可不使用)
WeakReferenceMessenger.Default.Unregister<Student>(this);
}
private void ExecuteAction(string? actioName)
{
if (actioName == "SubToMain")
{
WeakReferenceMessenger.Default.Send(new UserLoginMessage { User = "Admin" });
}
}
}
3.使用的Model如下:
public class Student
{
public string Name { get; set; } = string.Empty;
public int Age { get; set; }
}
public class UserLoginMessage
{
public string User { get; set; } = string.Empty;
}
4.总结
- 总体的使用和Prsim中的事件聚合器类似
- Prism事件聚合器订阅时默认是弱引用,可使用过滤器