本文主要是介绍CommunityToolkit.Mvvm笔记---ObservableRecipient,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
ObservableRecipient 类型是可观察对象的基类,这些对象还充当消息收件人,是 ObservableObject 的扩展,它还对使用 IMessenger 类型提供内置支持。这使得在不直接引用其他组件的情况下,组件之间可以相互通信。在MVVM架构中,这对于ViewModel之间的解耦非常有用。
平台 API:ObservableRecipient、ObservableObject、IMessenger、WeakReferenceMessenger、IRecipient<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继承,当它被禁用时,默认情况下会自动删除所有接收者的消息注册。
这篇关于CommunityToolkit.Mvvm笔记---ObservableRecipient的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!