从 MvvmLight 迁移
本文概述了 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
DialogService
DispatcherHelper
NavigationService
特定于 Android/iOS
ActivityBase
Binding
BindingMode
PropertyChangedEventManager
UpdateTriggerMode
特定于 Android
CachingViewHolder
ObservableAdapter
ObservableRecyclerAdapter
特定于 iOS
ObservableCollectionViewSource
ObservableTableViewController
ObservableTableViewSource
帮助程序
Empty
WeakAction
WeakFunc
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈