CommunityToolkit.Mvvm笔记---ObservableRecipient

ObservableRecipient 类型是可观察对象的基类,这些对象还充当消息收件人,是 ObservableObject 的扩展,它还对使用 IMessenger 类型提供内置支持。这使得在不直接引用其他组件的情况下,组件之间可以相互通信。在MVVM架构中,这对于ViewModel之间的解耦非常有用。

平台 API:ObservableRecipientObservableObjectIMessengerWeakReferenceMessengerIRecipient<TMessage>PropertyChangedMessage<T>

 消息通信实例如下:

发送方ViewModel,继承ObservableRecipient

 public partial class F0InstructionPageViewModel : ObservableRecipient
 {
     public F0InstructionPageViewModel()
     {
     }

     [RelayCommand]
     private void OnNextPage()
     {
        Messenger.Send("hello");
        //WeakReferenceMessenger.Default.Send("hello WPF");
        // StrongReferenceMessenger.Default.Send("hello WPF");
        //以上发送消息方式均可
     }
 }

 发送方xaml

<StackPanel Grid.Row="1">
    <Button Command="{Binding Path=NextPageCommand }" Content="Next"></Button>
</StackPanel> 

有两种接收方式

方式一:

接收方ViewModel,信息可以绑定到xaml中

public partial class MainPageViewModel : ObservableRecipient
{
    [ObservableProperty]
    private string receivedMessage;

    public MainPageViewModel()
    {
        Messenger.Register<string>(this,(r,m) =>
        {
            ReceivedMessage = m;
            MessageBox.Show(ReceivedMessage);
        });
    }
    
}

方式二:

 IRecipient<T>方式

接收方ViewModel,继承ObservableObject,IRecipient

 public partial class MainPageViewModel : ObservableObject, IRecipient<string>
 {

     public MainPageViewModel()
     {
         WeakReferenceMessenger.Default.Register(this);
     }

     [ObservableProperty]
     private string receivedMessage;
     public void Receive(string message)
     {
         ReceivedMessage = message;
         MessageBox.Show(receivedMessage);
     }
 }

当不再需要某个接收者时,你应该注销它,使其停止接收消息。你可以通过消息类、注册令牌或接收者来注销它:

// Unregisters the recipient from a message type
WeakReferenceMessenger.Default.Unregister<LoggedInUserChangedMessage>(this);

// Unregisters the recipient from a message type in a specified channel
WeakReferenceMessenger.Default.Unregister<LoggedInUserChangedMessage, int>(this, 42);

// Unregister the recipient from all messages, across all channels
WeakReferenceMessenger.Default.UnregisterAll(this);
 

 注意:

如前面所述,当使用 WeakReferenceMessenger 时,上面的注销操作不是严格需要的,因为使用弱引用来追踪接收者意味着不用的接收者即使仍然有激活的消息处理程序,它们仍会被GC清理。不过,取消订阅它们仍然是一个好的做法,这可以提高性能。

另一方面,StrongReferenceMessenger 实现使用了强引用来跟踪注册的接收者。这样做是出于性能考虑,这意味着每个注册的接收者应该手动被注销以避免内存泄漏。也就是说,只要注册了一个接收者,使用中StrongReferenceMessenger实例就会保活对它的引用,这将防止GC回收该实例。你可以手动处理它,也可以从ObservableRecipient继承,当它被禁用时,默认情况下会自动删除所有接收者的消息注册。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值