WPF中CommunityToolkit.Mvvm.dll的简单使用

1.通过Nuget安装 CommunityToolkit.Mvvm库

Install-Package CommunityToolkit.Mvvm

2.新建2个ViewModel通过Messenger进行通信

  • 主界面的ViewModel
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;
    }
}
  • 用户控件的ViewModel
 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事件聚合器订阅时默认是弱引用,可使用过滤器
posted @ 2025-03-20 09:59  新凉别处暑  阅读(215)  评论(0)    收藏  举报