本文概述了 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 类型。
此处的第一个更改是使用组件中的指令进行交换。
// 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);
请注意,如果从属性的 setter 调用此方法,则不需要 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) 没有直接对应的替代项。
为提高性能,建议改用 Toolkit 的 OnPropertyChanged(string) 通过 nameof 关键字替换 RaisePropertyChanged<T>(Expression)(或者在不带参数的情况下,如果目标属性与调用该方法的属性相同,则可如上所述自动推断其名称)。
// 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
以下步骤侧重于迁移利用 ViewModelBase MvvmLight 工具包的现有组件。
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 的方法。
此外,如果该方法是从属性的 setter 访问器中调用的,则不需要 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) 没有直接对应的替代项。
建议为提高性能,改为使用 MVVM 工具包的 SetProperty<T>(ref T, T, bool, string),并使用 nameof 关键字替换此项。
// 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));
请注意,调用Messenger方法时通过Broadcast属性发送的消息在 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 相同的功能。
OnDeactivated 在 MVVM 工具包中,调用时还将注销所有已注册的信使事件。
// MvvmLight
Cleanup();
// MVVM Toolkit
OnDeactivated();
请注意,OnActivated 和 OnDeactivated 方法可以像 Cleanup 一样从您现有的解决方案中调用。
但是,ObservableRecipient 提供了一个 IsActive 属性,设置该属性后,还会控制对这些方法的调用。
ViewModelBase 属性
MessengerInstance
MessengerInstance 有一个已重命名的直接替代项,即 Messenger。
// MvvmLight
IMessenger messenger = MessengerInstance;
// MVVM Toolkit
IMessenger messenger = Messenger;
注释
属性的 Messenger 默认值将是 WeakReferenceMessenger.Default 实例,这是 MVVM 工具包中的标准弱引用信使实现。 只需向 ObservableRecipient 构造函数中注入不同的 IMessenger 实例,即可对此进行自定义。
IsInDesignMode
没有直接替换 IsInDesignMode 属性,应更改或删除使用此属性的任何代码。
之所以未将 IsInDesignMode 纳入 MVVM Toolkit,是因为该属性暴露了平台特定的实现。 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 迁移
以下步骤侧重于迁移利用 RelayCommand MvvmLight 工具包的现有组件。
MVVM 工具包提供一种 RelayCommand 类型,该类型提供类似功能,以利用 ICommand 系统接口。
下面是在当前解决方案中使用时需要执行的迁移列表。 如果未列出方法或属性,则 MVVM 工具包中存在同名的直接替换,无需更改。
此处的第一个更改是使用组件中的指令进行交换。
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
注释
MvvmLight 使用弱引用在命令与从关联类调用的操作之间建立链接。 这不是 MVVM Toolkit 实现所必需的;如果你在任何构造函数中将此可选参数设置为 true,则会将其移除。
将 RelayCommand 与异步操作配合使用
如果你当前正在使用 MvvmLight RelayCommand 实现来处理异步操作,MVVM Toolkit 为这些场景提供了改进后的实现。
只需将现有的 RelayCommand 替换为专为异步用途构建的 AsyncRelayCommand。
// MvvmLight
var command = new RelayCommand(() => OnCommandAsync());
var command = new RelayCommand(async () => await OnCommandAsync());
// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand(OnCommandAsync);
RelayCommand 方法
RaiseCanExecuteChanged()
RaiseCanExecuteChanged() 的功能可以通过 MVVM Toolkit 的 NotifyCanExecuteChanged() 方法实现。
// MvvmLight
var command = new RelayCommand(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand(OnCommand);
command.NotifyCanExecuteChanged();
迁移 RelayCommand<T>
以下步骤侧重于迁移利用 RelayCommand<T> MvvmLight 工具包的现有组件。
MVVM 工具包提供一种 RelayCommand<T> 类型,该类型提供类似功能,以利用 ICommand 系统接口。
下面是在当前解决方案中使用时需要执行的迁移列表。 如果未列出方法或属性,则 MVVM 工具包中存在同名的直接替换,无需更改。
此处的第一个更改是使用组件中的指令进行交换。
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
使用 RelayCommand 处理异步操作
如果你当前正在使用 MvvmLight RelayCommand<T> 来处理异步操作,MVVM Toolkit 为这些场景提供了更好的实现。
你只需将现有的 RelayCommand<T> 替换为专为异步用途构建的 AsyncRelayCommand<T>。
// MvvmLight
var command = new RelayCommand<string>(async () => await OnCommandAsync());
// MVVM Toolkit
var asyncCommand = new AsyncRelayCommand<string>(OnCommandAsync);
RelayCommand<T> 方法
RaiseCanExecuteChanged()
RaiseCanExecuteChanged() 的功能可以通过 MVVM Toolkit 的 NotifyCanExecuteChanged() 方法实现。
// 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 方法。 在下面的示例中,将使用 ServiceCollection 库中的 Microsoft.Extensions.DependencyInjection 类型。
这是 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());
}
解析依赖项
初始化后,可以像使用 SimpleIoc 一样,从 Ioc 类中检索服务:
IDialogService dialogService = SimpleIoc.Default.GetInstance<IDialogService>();
迁移到 MVVM 工具包后,你将通过以下方法实现相同的目标:
IDialogService dialogService = Ioc.Default.GetService<IDialogService>();
删除依赖项
使用 SimpleIoc,可以通过调用以下方法来取消注册依赖项。
SimpleIoc.Default.Unregister<INavigationService>();
对于通过 MVVM Toolkit 的 Ioc 实现来移除依赖项这一做法,没有直接的替代方案。
首选构造函数
使用 MvvmLight 的 SimpleIoc 注册依赖项时,对于具有多个构造函数的类,你可以指定一个 PreferredConstructor 特性。
凡是使用了此属性的地方,都需要将其移除;如果支持的话,你需要改用当前所使用的第三方依赖注入库提供的相应属性。
迁移 Messenger
以下步骤重点介绍如何迁移现有的、利用 MvvmLight Toolkit 的 Messenger 的组件。
MVVM 工具包提供了两种信使实现(WeakReferenceMessenger 和 StrongReferenceMessenger,请参阅 此处的文档),它们提供了类似的功能,但彼此之间存在一些关键差异,详见下文。
下面是在当前解决方案中使用时需要执行的迁移列表。
此处的第一个更改是使用组件中的指令进行交换。
// MvvmLight
using GalaSoft.MvvmLight.Messaging;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Messaging;
Messenger 方法
Register<TMessage>(object, Action<TMessage>)
可以使用 MVVM 工具包的Register<TMessage>(object, Action<TMessage>)扩展方法IMessenger实现此功能Register<TRecipient, TMessage>(object, MessageHandler<TRecipient, 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> 接口(详见 Messenger 文档),这样可以自动完成注册,并使代码更简洁。
注释
static lambda 表达式的修饰符需要 C# 9,它是可选的。 在这里使用它有助于确保你不会意外捕获接收对象或其他成员,从而导致分配闭包,但这并不是必需的。 如果无法使用 C# 9,可以在此处删除 static ,并小心确保代码未捕获任何内容。
此外,本示例以及下面的示例都只会使用来自 ObservableRecipient 的 Messenger 属性。 如果你只是想在代码中的其他任意位置静态访问 Messenger 实例,那么上述示例同样适用,唯一的区别是需要将 Messenger 替换为例如…… 改用 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>)
Register<TMessage>(object, object, Action<TMessage>) 的功能可以通过 MVVM 工具包的 Register<TRecipient, TMessage, TToken>(object, TToken, MessageHandler<TRecipient, 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 工具包的Send<TMessage>(TMessage)扩展方法IMessenger实现此功能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)
Send<TMessage>(TMessage, object) 的功能可以通过 MVVM Toolkit 的 Send<TMessage, TToken>(TMessage, TToken) 方法来实现。
// 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)
Unregister(object) 的功能可以通过 MVVM Toolkit 的 UnregisterAll(object) 方法来实现。
// MvvmLight
Messenger.Default.Unregister(this);
// MVVM Toolkit
Messenger.UnregisterAll(this);
Unregister<TMessage>(object)
可以使用 MVVM 工具包的Unregister<TMessage>(object)扩展方法IMessenger实现此功能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)
Unregister<TMessage>(object, object) 的功能可以通过 MVVM 工具包的 Unregister<TMessage, TToken>(object, TToken) 方法来实现。
// 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()
ResetAll() 的功能可以通过 MVVM Toolkit 的 Reset() 方法实现。
与 MvvmLight 将实例置为 null 的实现不同,MVVM Toolkit 会清空已注册的映射关系。
// MvvmLight
Messenger.Default.ResetAll();
// MVVM Toolkit
Messenger.Reset();
Messenger 静态方法
OverrideDefault(IMessenger)
MVVM Toolkit 中没有可直接替代 OverrideDefault(IMessenger) 方法的项。
若要使用 IMessenger 的自定义实现,可以通过以下两种方式之一:在用于依赖注入的服务注册中注册该自定义实现,或者手动构造一个静态实例并在需要的地方传入该实例。
// MvvmLight
Messenger.OverrideDefault(new Messenger());
// MVVM Toolkit
// No direct replacement
Reset()
MVVM 工具包中没有静态 Reset 方法的直接替换。
通过调用 Reset 其中一种信使类型的静态 Default 实例的方法,可以实现相同的功能。
// MvvmLight
Messenger.Reset();
// MVVM Toolkit
WeakReferenceMessenger.Default.Reset();
Messenger 静态属性
Default
Default 有一个直接替代项,即 Default,无需更改您现有的实现。
// MvvmLight
IMessenger messenger = Messenger.Default;
// MVVM Toolkit
IMessenger messenger = WeakReferenceMessenger.Default;
迁移消息类型
MvvmLight 工具包中提供的消息类型被设计为一种基础,供开发人员在需要时使用。
虽然 MVVM 工具包提供了一些替代方案,但这些消息类型并没有直接对应的替代项。 建议查看 可用的消息类型。
或者,如果解决方案利用 MvvmLight 消息类型,则可以轻松地将这些类型移植到自己的代码库。
迁移平台特定组件
在当前的 MVVM Toolkit 实现中,对于 MvvmLight 工具包中现有的特定于平台的组件,还没有对应的替代项。
以下组件及其关联的帮助程序/扩展方法没有替换项,在迁移到 MVVM 工具包时需要考虑。
Android/iOS/Windows 专用
DialogServiceDispatcherHelperNavigationService
Android/iOS 专用
ActivityBaseBindingBindingModePropertyChangedEventManagerUpdateTriggerMode
Android 专用
CachingViewHolderObservableAdapterObservableRecyclerAdapter
iOS 特有
ObservableCollectionViewSourceObservableTableViewControllerObservableTableViewSource
Helpers
EmptyWeakActionWeakFunc