在wpf程序中,MVVM框架下的消息传递机制,用于VM中访问界面元素

定义消息类

首先,我们需要定义消息类来表示不同的消息类型。在示例中,我们创建了一个叫做CloseWindowMessage的消息类,用于表示需要关闭窗体的消息。这个类通常是一个简单的标记类,不包含任何额外的数据。

public class CloseWindowMessage
{
    // 这里可以添加任何额外的信息或方法,但通常情况下不需要
}


创建消息中心类
接下来,我们需要创建一个消息中心类,用于管理消息的订阅和发布。在示例中,我们创建了一个静态类MessageCenter,它包含了订阅、取消订阅和发布消息的静态方法。

public class CloseWindowMessage

   //消息中心,用于管理消息的订阅和发布
   public static class MessageCenter
   {
       private static Dictionary<Type, List<Action<object>>> _subscribers = new Dictionary<Type, List<Action<object>>>();
       // 订阅消息的方法
       public static void Subscribe<TMessage>(Action<TMessage> action)
       {
           // 实现订阅逻辑
           Type messageType = typeof(TMessage);
           if (!_subscribers.ContainsKey(messageType))
           {
               _subscribers[messageType] = new List<Action<object>>();
           }

           _subscribers[messageType].Add(obj => action((TMessage)obj));
       }
       // 取消订阅消息的方法
       public static void Unsubscribe<TMessage>(Action<TMessage> action)
       {
           // 实现取消订阅逻辑
           Type messageType = typeof(TMessage);
           if (_subscribers.ContainsKey(messageType))
           {
               _subscribers[messageType].Remove(obj => action((TMessage)obj));
           }
       }

       // 发布消息的方法
       public static void Send<TMessage>(TMessage message)
       {
           // 实现发布消息逻辑
           Type messageType = typeof(TMessage);
           if (_subscribers.ContainsKey(messageType))
           {
               foreach (var subscriber in _subscribers[messageType])
               {
                   subscriber(message);
               }
           }
       }
   }
   public class Message
   {
       public string Content { get; }

       public Message(string content)
       {
           Content = content;
       }
   }

订阅消息

在需要接收特定类型消息的地方(比如ViewModel或窗体),我们调用MessageCenter.Subscribe方法来订阅消息。在示例中,我们在ViewModel的构造函数中订阅了CloseWindowMessage消息,并指定了一个方法来处理收到的消息。
 

 public class ViewModel
{
    public ViewModel()
    {
        // 订阅关闭窗体消息
        MessageCenter.Subscribe<CloseWindowMessage>(OnCloseWindowMessageReceived);
    }

    // 处理收到的关闭窗体消息的方法
    private void OnCloseWindowMessageReceived(CloseWindowMessage message)
    {
        // 执行关闭窗体的逻辑...
    }
}


发布消息

当某个事件发生,需要发送消息时(比如点击按钮关闭窗体),我们调用MessageCenter.Send方法来发布消息。在示例中,当用户点击关闭按钮时,ViewModel调用MessageCenter.Send来发布CloseWindowMessage消息。
 

public class ViewModel
{
    public ViewModel()
    {
        CloseWindowCommand = new RelayCommand(CloseWindow);
    }

    public ICommand CloseWindowCommand { get; }

    private void CloseWindow()
    {
        // 发布关闭窗体消息
        MessageCenter.Send(new CloseWindowMessage());
    }
}


处理消息

订阅了消息的部分会收到消息,并根据需要执行相应的操作。在示例中,窗体订阅了CloseWindowMessage消息,并在收到消息时执行关闭窗体的操作。

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        // 订阅关闭窗体消息
        MessageCenter.Subscribe<CloseWindowMessage>(OnCloseWindowMessageReceived);
    }

    private void OnCloseWindowMessageReceived(CloseWindowMessage message)
    {
        // 执行关闭窗体的操作
        Close();
    }
}

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值