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事件聚合器订阅时默认是弱引用,可使用过滤器