本文概述了 MvvmLight 工具包和 MVVM 工具包之间的一些主要差异,帮助简化迁移。
虽然本文重点介绍从 MvvmLight 迁移到 MVVM 工具包,但请注意,由于我们在 MVVM 工具包中做出了其他改进,强烈建议查看各个新 API 的文档。
平台 API:
ObservableObject、ObservableRecipient、RelayCommand、RelayCommand<T>、AsyncRelayCommand、AsyncRelayCommand<T>、IMessenger、WeakReferenceMessenger、StrongReferenceMessenger、IRecipient<TMessage>、MessageHandler<TRecipient, TMessage>、IMessengerExtensions
安装 MVVM 工具包
若要利用 MVVM 工具包,首先需要将最新的 NuGet 包安装到现有的 .NET 应用程序。
通过 .NET CLI 安装
dotnet add package CommunityToolkit.Mvvm --version 8.1.0
通过 PackageReference 安装
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.1.0" />
迁移 ObservableObject
以下步骤侧重于迁移利用 MvvmLight 工具包的 ObservableObject 的现有组件。 MVVM 工具包提供了类似的 ObservableObject 类型。
此处的第一个更改是交换组件中的 using 指令。
// MvvmLight
using GalaSoft.MvvmLight;
// MVVM Toolkit
using CommunityToolkit.Mvvm.ComponentModel;
下面是在当前解决方案中使用时需要执行的迁移列表。
ObservableObject 方法
Set<T>(Expression, ref T, T)
Set(Expression, ref T, T) 没有类似的方法签名替代项。
但是,SetProperty(ref T, T, string) 可提供相同的功能,以及额外的性能优势。
// MvvmLight
Set(() => MyProperty, ref this.myProperty, value);
// MVVM Toolkit
SetProperty(ref this.myProperty, value);
请注意,如果从属性的资源库调用该方法,则不需要 string 参数,因为它是从调用方成员名称推断而来,如此处所示。 如果要为一个属性(不同于调用方法的属性)调用 SetProperty,可以使用 nameof 运算符执行此操作。由于没有硬编码的名称,这样做有助于减少代码出错的可能性。 例如:
SetProperty(ref this.someProperty, value, nameof(SomeProperty));
Set<T>(string, ref T, T)
Set<T>(string, ref T, T) 没有类似的方法签名替代项。
但是,SetProperty<T>(ref T, T, string) 可使用重新排序的参数提供相同的功能。
// MvvmLight
Set(nameof(MyProperty), ref this.myProperty, value);
// MVVM Toolkit
SetProperty(ref this.myProperty, value);
Set<T>(ref T, T, string)
Set<T>(ref T, T, string) 具有重命名的直接替代项 SetProperty<T>(ref T, T, string)。
// MvvmLight
Set(ref this.myProperty, value, nameof(MyProperty));
// MVVM Toolkit
SetProperty(ref this.myProperty, value);
RaisePropertyChanged(string)
RaisePropertyChanged(string) 具有重命名的直接替代项 OnPropertyChanged(string)。
// MvvmLight
RaisePropertyChanged(nameof(MyProperty));
// MVVM Toolkit
OnPropertyChanged();
与 SetProperty 一样,当前属性的名称是由 OnPropertyChanged 方法自动推断而来。 如果要使用此方法手动为另一个属性引发 PropertyChanged 事件,还可以再次使用 nameof 运算符手动指定该属性的名称。 例如:
OnPropertyChanged(nameof(SomeProperty));
RaisePropertyChanged<T>(Expression)
RaisePropertyChanged<T>(Expression) 没有直接替代项。
为提高性能,建议使用 nameof 关键字将 RaisePropertyChanged<T>(Expression) 替换为工具包的 OnPropertyChanged(string)(或者如果目标属性与调用该方法的属性相同,则不使用参数,这样可以像上面提到的那样自动推断名称)。
// MvvmLight
RaisePropertyChanged(() => MyProperty);
// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
VerifyPropertyName(string)
VerifyPropertyName(string) 方法没有直接替代项,应更改或删除使用此属性的任何代码。
在 MVVM 工具包中省略掉的原因是,通过为属性使用 nameof 关键字,可验证它是否存在。 生成 MvvmLight 时,nameof 关键字不可用,此方法用于确保对象上存在该属性。
// MvvmLight
VerifyPropertyName(nameof(MyProperty));
// MVVM Toolkit
// No direct replacement, remove
ObservableObject 属性
PropertyChangedHandler
PropertyChangedHandler 没有直接替代项。
若要通过 PropertyChanged 事件处理程序引发属性更改事件,需要改为调用 OnPropertyChanged 方法。
// MvvmLight
PropertyChangedEventHandler handler = PropertyChangedHandler;
// MVVM Toolkit
OnPropertyChanged();
迁移 ViewModelBase
以下步骤侧重于迁移利用 MvvmLight 工具包的 ViewModelBase 的现有组件。
MVVM 工具包提供 ObservableRecipient 类型,它具有类似的功能。
下面是在当前解决方案中使用时需要执行的迁移列表。
ViewModelBase 方法
Set<T>(string, ref T, T, bool)
Set<T>(string, ref T, T, bool) 没有类似的方法签名替代项。
但是,SetProperty<T>(ref T, T, bool, string) 可使用重新排序的参数提供相同的功能。
// MvvmLight
Set(nameof(MyProperty), ref this.myProperty, value, true);
// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);
请注意,在 MVVM 工具包的实现中,值和广播布尔参数不是可选项,必须提供这些信息才能使用此方法。 进行此更改的原因是,通过在调用此方法时省略广播参数,可默认调用 ObservableObject 的 SetProperty 方法。
此外,如果从属性的资源库调用该方法,则不需要 string 参数,因为它是从调用方成员名称推断而来的,就像 ObservableObject 基类中的方法一样。
Set<T>(ref T, T, bool, string)
Set<T>(ref T, T, bool, string) 具有重命名的直接替代项 SetProperty<T>(ref T, T, bool, string)。
// MvvmLight
Set(ref this.myProperty, value, true, nameof(MyProperty));
// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);
Set<T>(Expression, ref T, T, bool)
Set<T>(Expression, ref T, T, bool) 没有直接替代项。
为提高性能,建议使用 nameof 关键字将其替换为 MVVM 工具包的 SetProperty<T>(ref T, T, bool, string)。
// MvvmLight
Set<MyObject>(() => MyProperty, ref this.myProperty, value, true);
// MVVM Toolkit
SetProperty(ref this.myProperty, value, true);
Broadcast<T>(T, T, string)
Broadcast<T>(T, T, string) 有不需要重命名的直接替代项。
// MvvmLight
Broadcast<MyObject>(oldValue, newValue, nameof(MyProperty));
// MVVM Toolkit
Broadcast(oldValue, newValue, nameof(MyProperty));
请注意,调用 Broadcast 方法时通过 Messenger 属性发送的消息在 MVVM 工具包库中有 PropertyChangedMessage 的直接替代项。
RaisePropertyChanged<T>(string, T, T, bool)
RaisePropertyChanged<T>(string, T, T, bool) 方法没有直接替代项。
最简单的替代方法是调用 OnPropertyChanged 并随后调用 Broadcast 以实现此功能。
// MvvmLight
RaisePropertyChanged<MyObject>(nameof(MyProperty), oldValue, newValue, true);
// MVVM Toolkit
OnPropertyChanged();
Broadcast(oldValue, newValue, nameof(MyProperty));
RaisePropertyChanged<T>(Expression, T, T, bool)
RaisePropertyChanged<T>(Expression, T, T, bool) 方法没有直接替代项。
最简单的替代方法是调用 OnPropertyChanged 并随后调用 Broadcast 以实现此功能。
// MvvmLight
RaisePropertyChanged<MyObject>(() => MyProperty, oldValue, newValue, true);
// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
Broadcast(oldValue, newValue, nameof(MyProperty));
ICleanup.Cleanup()
ICleanup 接口没有直接替代项。
但是,ObservableRecipient 提供了 OnDeactivated 方法,应将该方法用于提供与 Cleanup 相同的功能。
MVVM 工具包中的 OnDeactivated 也会在调用时注销所有已注册的信使事件。
// MvvmLight
Cleanup();
// MVVM Toolkit
OnDeactivated();
请注意,可以像调用 Cleanup 一样从现有解决方案中调用 OnActivated 和 OnDeactivated 方法。
但是,ObservableRecipient 公开了 IsActive 属性,该属性在设置后还可控制对这些方法的调用。
ViewModelBase 属性
MessengerInstance
MessengerInstance 有重命名的直接替代项 Messenger
// MvvmLight
IMessenger messenger = MessengerInstance;
// MVVM Toolkit
IMessenger messenger = Messenger;
注意
Messenger 属性的默认值为 WeakReferenceMessenger.Default 实例,这是 MVVM 工具包中的标准弱引用信使实现。 只需将其他 IMessenger 实例注入 ObservableRecipient 构造函数即可自定义此实例。
IsInDesignMode
IsInDesignMode 属性没有直接替代项,应更改或删除使用此属性的任何代码。
在 MVVM 工具包中省略掉的原因是,IsInDesignMode 属性公开了特定于平台的实现。 MVVM 工具包已设计为与平台无关。
// MvvmLight
var isInDesignMode = IsInDesignMode;
// MVVM Toolkit
// No direct replacement, remove
ViewModelBase 静态属性
IsInDesignModeStatic
IsInDesignModeStatic 属性没有直接替代项,应更改或删除使用此属性的任何代码。
在 MVVM 工具包中省略掉的原因是,IsInDesignMode 属性公开了特定于平台的实现。 MVVM 工具包已设计为与平台无关。
// MvvmLight
var isInDesignMode = ViewModelBase.IsInDesignModeStatic;
// MVVM Toolkit
// No direct replacement, remove
迁移 RelayCommand
以下步骤侧重于迁移利用 MvvmLight 工具包的 RelayCommand 的现有组件。
MVVM 工具包提供一个 RelayCommand 类型,该类型提供了类似的功能,可利用 ICommand 系统接口。
下面是在当前解决方案中使用时需要执行的迁移列表。 如果未列出方法或属性,则 MVVM 工具包中提供了具有相同名称的直接替代项,且无需更改。
此处的第一个更改是交换组件中的 using 指令。
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
注意
MvvmLight 使用弱引用在命令与从关联类调用的操作之间建立链接。 MVVM 工具包实现不需要此操作,如果已在任何构造函数中将此可选参数设置为 true,则会删除此参数。
将 RelayCommand 用于异步操作
如果正在将 MvvmLight RelayCommand 实现用于异步操作,则 MVVM 工具包会为这些方案公开改进的实现。
只需将现有 RelayCommand 替换为针对异步操作生成的 AsyncRelayCommand。
// MvvmLight
var command = new RelayCommand(() => OnCommandAsync());
var command = new RelayCommand(async () => await OnCommandAsync());
// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand(OnCommandAsync);
RelayCommand 方法
RaiseCanExecuteChanged()
可以通过 MVVM 工具包的 NotifyCanExecuteChanged() 方法实现 RaiseCanExecuteChanged() 的功能。
// MvvmLight
var command = new RelayCommand(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand(OnCommand);
command.NotifyCanExecuteChanged();
迁移 RelayCommand<T>
以下步骤侧重于迁移利用 MvvmLight 工具包的 RelayCommand<T> 的现有组件。
MVVM 工具包提供一个 RelayCommand<T> 类型,该类型提供了类似的功能,可利用 ICommand 系统接口。
下面是在当前解决方案中使用时需要执行的迁移列表。 如果未列出方法或属性,则 MVVM 工具包中提供了具有相同名称的直接替代项,且无需更改。
此处的第一个更改是交换组件中的 using 指令。
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
将 RelayCommand 与异步操作一起使用
如果正在将 MvvmLight RelayCommand<T> 实现用于异步操作,则 MVVM 工具包会为这些方案公开改进的实现。
只需将现有 RelayCommand<T> 替换为针对异步操作生成的 AsyncRelayCommand<T>。
// MvvmLight
var command = new RelayCommand<string>(async () => await OnCommandAsync());
// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand<string>(OnCommandAsync);
RelayCommand<T> 方法
RaiseCanExecuteChanged()
可以通过 MVVM 工具包的 NotifyCanExecuteChanged() 方法实现 RaiseCanExecuteChanged() 的功能。
// MvvmLight
var command = new RelayCommand<string>(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand<string>(OnCommand);
command.NotifyCanExecuteChanged();
迁移 SimpleIoc
MVVM 工具包中的 IoC 实现不包含任何用于自行处理依赖项注入的内置逻辑,因此可以随意使用任何第三方库来检索 IServiceProvider 实例,然后可以将其传递给 Ioc.ConfigureServices 方法。 在下面的示例中,将使用 Microsoft.Extensions.DependencyInjection 库中的 ServiceCollection 类型。
这是 MvvmLight 和 MVVM 工具包之间的最大更改。
如果已经执行过使用 ASP.NET Core 应用程序实现依赖项注入的操作,此实现会让你觉得很熟悉。
注册依赖项
使用 MvvmLight 时,你可能已经使用 SimpleIoc 注册与这些方案类似的依赖项。
public void RegisterServices()
{
SimpleIoc.Default.Register<INavigationService, NavigationService>();
SimpleIoc.Default.Register<IDialogService>(() => new DialogService());
}
使用 MVVM 工具包,同样可以完成这一操作,如下所述。
public void RegisterServices()
{
Ioc.Default.ConfigureServices(
new ServiceCollection()
.AddSingleton<INavigationService, NavigationService>()
.AddSingleton<IDialogService>(new DialogService())
.BuildServiceProvider());
}
解析依赖项
初始化后,可以从 Ioc 类中检索服务,就像从 SimpleIoc 中检索服务一样:
IDialogService dialogService = SimpleIoc.Default.GetInstance<IDialogService>();
迁移到 MVVM 工具包后,将通过以下方法实现相同的目标:
IDialogService dialogService = Ioc.Default.GetService<IDialogService>();
删除依赖项
有了 SimpleIoc,可以使用以下方法调用取消注册依赖项。
SimpleIoc.Default.Unregister<INavigationService>();
对于使用 MVVM 工具包 Ioc 实现删除依赖项,没有直接替代方法。
首选构造函数
在使用 MvvmLight 的 SimpleIoc 注册依赖项时,可以选择在类中为包含多个构造函数的类提供 PreferredConstructor 特性。
此特性需要删除其使用位置,并且需要用到正在使用中的第三方依赖项注入库中的任何特性(如果受支持)。
迁移 Messenger
以下步骤侧重于迁移利用 MvvmLight 工具包的 Messenger 的现有组件。
MVVM 工具包提供两种信使实现(WeakReferenceMessenger 和 StrongReferenceMessenger,请参阅此处的文档),这些实现提供类似的功能,下面详细介绍一些主要差异。
下面是在当前解决方案中使用时需要执行的迁移列表。
此处的第一个更改是交换组件中的 using 指令。
// MvvmLight
using GalaSoft.MvvmLight.Messaging;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Messaging;
信使方法
Register<TMessage>(object, Action<TMessage>)
可以使用 MVVM 工具包的 IMessenger 扩展方法 Register<TRecipient, TMessage>(object, MessageHandler<TRecipient, TMessage>) 实现 Register<TMessage>(object, Action<TMessage>) 的功能。
// MvvmLight
Messenger.Default.Register<MyMessage>(this, this.OnMyMessageReceived);
// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage>(this, static (r, m) => r.OnMyMessageReceived(m));
之所以要求此签名,是因为它允许信使使用弱引用来正确跟踪接收者,并避免创建闭包来捕获接收者本身。 也就是说,会将输入接收方作为输入传递给 lambda 表达式,因此它不需要由 lambda 表达式本身捕获。 这也使得代码使用效率更高,因为同一处理程序可以多次重复使用,且无需分配。 请注意,这只是支持的注册处理程序的方法之一,并且还可以改用 IRecipient<TMessage> 接口(信使文档中有详述),这使得注册不但可自动进行,还无需费时费力。
注意
lambda 表达式的 static 修饰符需要 C# 9,这是可选的。 在此处使用它来确保不会意外捕获接收者或其他成员,从而导致分配闭包,但这不是强制性的。 如果无法使用 C# 9,可以在此处删除 static,并小心确保代码不会捕获任何内容。
此外,此示例和下面的示例将仅使用 ObservableRecipient 中的 Messenger 属性。 如果只想从代码中的其他任何位置静态访问信使实例,则该示例同样适用,唯一的区别在于,需将 Messenger 替换为 eg。 改用 WeakReferenceMessenger.Default。
Register<TMessage>(object, bool, Action<TMessage>)
此注册机制没有直接替代项,因此还可以支持接收派生消息类型的消息。 此更改是有意为之,因为 Messenger 实现旨在不使用反射来发挥其性能优势。
还有其他一些方法可用于实现此功能。
- 创建自定义
IMessenger实现。 - 使用共享处理程序注册其他消息类型,然后检查该类型并调用正确的方法。
// MvvmLight
Messenger.Default.Register<MyMessage>(this, true, this.OnMyMessageReceived);
// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage>(this, static (r, m) => r.OnMyMessageReceived(m));
Messenger.Register<MyViewModel, MyOtherMessage>(this, static (r, m) => r.OnMyMessageReceived(m));
Register<TMessage>(object, object, Action<TMessage>)
可以使用 MVVM 工具包的 Register<TRecipient, TMessage, TToken>(object, TToken, MessageHandler<TRecipient, TMessage>) 方法实现 Register<TMessage>(object, object, Action<TMessage>) 的功能。
// MvvmLight
Messenger.Default.Register<MyMessage>(this, nameof(MyViewModel), this.OnMyMessageReceived);
// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage, string>(this, nameof(MyViewModel), static (r, m) => r.OnMyMessageReceived(m));
Register<TMessage>(object, object, bool, Action<TMessage>)
此注册机制没有直接替代项,因此还可以支持接收派生消息类型的消息。 此更改是有意为之,因为 Messenger 实现旨在不使用反射来发挥其性能优势。
还有其他一些方法可用于实现此功能。
- 创建自定义
IMessenger实现。 - 使用共享处理程序注册其他消息类型,然后检查该类型并调用正确的方法。
// MvvmLight
Messenger.Default.Register<MyMessage>(this, nameof(MyViewModel), true, this.OnMyMessageReceived);
// MVVM Toolkit
Messenger.Register<MyViewModel, MyMessage, string>(this, nameof(MyViewModel), static (r, m) => r.OnMyMessageReceived(m));
Messenger.Register<MyViewModel, MyOtherMessage, string>(this, nameof(MyViewModel), static (r, m) => r.OnMyMessageReceived(m));
Send<TMessage>(TMessage)
可以使用 MVVM 工具包的 IMessenger 扩展方法 Send<TMessage>(TMessage) 实现 Send<TMessage>(TMessage) 的功能。
// MvvmLight
Messenger.Default.Send<MyMessage>(new MyMessage());
Messenger.Default.Send(new MyMessage());
// MVVM Toolkit
Messenger.Send(new MyMessage());
对于发送的消息包含无参数构造函数的上述场景,MVVM 工具包有简化的扩展,可用于以此格式发送消息。
// MVVM Toolkit
Messenger.Send<MyMessage>();
Send<TMessage>(TMessage, object)
可以使用 MVVM 工具包的 Send<TMessage, TToken>(TMessage, TToken) 方法实现 Send<TMessage>(TMessage, object) 的功能。
// MvvmLight
Messenger.Default.Send<MyMessage>(new MyMessage(), nameof(MyViewModel));
Messenger.Default.Send(new MyMessage(), nameof(MyViewModel));
// MVVM Toolkit
Messenger.Send(new MyMessage(), nameof(MyViewModel));
Unregister(object)
可以使用 MVVM 工具包的 UnregisterAll(object) 方法实现 Unregister(object) 的功能。
// MvvmLight
Messenger.Default.Unregister(this);
// MVVM Toolkit
Messenger.UnregisterAll(this);
Unregister<TMessage>(object)
可以使用 MVVM 工具包的 IMessenger 扩展方法 Unregister<TMessage>(object) 实现 Unregister<TMessage>(object) 的功能。
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this);
// MVVM Toolkit
Messenger.Unregister<MyMessage>(this);
Unregister<TMessage>(object, Action<TMessage>)
MVVM 工具包中没有 Unregister<TMessage>(object, Action<TMessage>) 方法的直接替代项。
省略的原因是,对于任何给定消息类型,消息接收者只能具有一个已注册的处理程序。
建议使用 MVVM 工具包的 IMessenger 扩展方法 Unregister<TMessage>(object)实现此功能。
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, OnMyMessageReceived);
// MVVM Toolkit
Messenger.Unregister<MyMessage>(this);
Unregister<TMessage>(object, object)
可以使用 MVVM 工具包的 Unregister<TMessage, TToken>(object, TToken) 方法实现 Unregister<TMessage>(object, object) 功能。
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, nameof(MyViewModel));
// MVVM Toolkit
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));
Unregister<TMessage>(object, object, Action<TMessage>)
MVVM 工具包中没有 Unregister<TMessage>(object, object, Action<TMessage>) 方法的直接替代项。
省略的原因是,对于任何给定消息类型,消息接收者只能具有一个已注册的处理程序。
建议使用 MVVM 工具包的 Unregister<TMessage, TToken>(object, TToken) 方法实现此功能。
// MvvmLight
Messenger.Default.Unregister<MyMessage>(this, nameof(MyViewModel), OnMyMessageReceived);
// MVVM Toolkit
Messenger.Unregister<MyMessage, string>(this, nameof(MyViewModel));
Cleanup()
Cleanup 方法在 MVVM 工具包中有一个同名的直接替代项。 请注意,仅当信使使用弱引用时,此方法才有用。而调用此方法时,StrongReferenceMessenger 类型完全不会执行任何操作,因为内部状态已在使用信使时自动调整。
// MvvmLight
Messenger.Default.Cleanup();
// MVVM Toolkit
Messenger.Cleanup();
RequestCleanup()
MVVM 工具包中没有 RequestCleanup 方法的直接替代项。 在 MvvmLight 上下文中,RequestCleanup 用于启动请求,以删除由于实现利用了弱引用而不再有效的注册。
对 RequestCleanup 方法的任何调用都可以被删除或替换为 Cleanup。
// MvvmLight
Messenger.Default.RequestCleanup();
// MVVM Toolkit
// No direct replacement, remove
ResetAll()
可以使用 MVVM 工具包的 Reset() 方法实现 ResetAll() 功能。
与 MvvmLight 的实现(将实例清空)不同,MVVM 工具包会清除已注册的映射。
// MvvmLight
Messenger.Default.ResetAll();
// MVVM Toolkit
Messenger.Reset();
信使静态方法
OverrideDefault(IMessenger)
MVVM 工具包中没有 OverrideDefault(IMessenger) 方法的直接替代项。
要使用 IMessenger 的自定义实现,请在服务注册中注册自定义实现以注入依赖项或手动构建静态实例,并在需要的情况下传递此实现。
// MvvmLight
Messenger.OverrideDefault(new Messenger());
// MVVM Toolkit
// No direct replacement
Reset()
MVVM 工具包中的静态 Reset 方法没有直接替代项。
通过调用其中一种信使类型的静态 Default 实例的 Reset 方法,可以实现相同的功能。
// MvvmLight
Messenger.Reset();
// MVVM Toolkit
WeakReferenceMessenger.Default.Reset();
信使静态属性
Default
Default 具有直接替代项 Default,无需更改现有实现。
// MvvmLight
IMessenger messenger = Messenger.Default;
// MVVM Toolkit
IMessenger messenger = WeakReferenceMessenger.Default;
迁移消息类型
MvvmLight 工具包中提供的消息类型被设计为一个基础,供开发人员在需要时使用。
虽然 MVVM 工具包提供了一些替代方法,但这些消息类型没有直接替代项。 建议查看可用的消息类型。
或者,如果解决方案利用 MvvmLight 消息类型,则可以轻松地将这些类型移植到自己的代码库。
迁移特定于平台的组件
在当前的 MVVM 工具包实现中,MvvmLight 工具包中存在的特定于平台的组件没有替代项。
以下组件及其关联的帮助程序/扩展方法没有替代项,在迁移到 MVVM 工具包时需要考虑到这一点。
特定于 Android/iOS/Windows
DialogServiceDispatcherHelperNavigationService
特定于 Android/iOS
ActivityBaseBindingBindingModePropertyChangedEventManagerUpdateTriggerMode
特定于 Android
CachingViewHolderObservableAdapterObservableRecyclerAdapter
特定于 iOS
ObservableCollectionViewSourceObservableTableViewControllerObservableTableViewSource
帮助程序
EmptyWeakActionWeakFunc