从 MvvmLight 迁移

本文概述了 MvvmLight 工具包和 MVVM 工具包之间的一些主要差异,帮助简化迁移。

虽然本文重点介绍从 MvvmLight 迁移到 MVVM 工具包,但请注意,由于我们在 MVVM 工具包中做出了其他改进,强烈建议查看各个新 API 的文档。

平台 API:ObservableObjectObservableRecipientRelayCommandRelayCommand<T>AsyncRelayCommandAsyncRelayCommand<T>IMessengerWeakReferenceMessengerStrongReferenceMessengerIRecipient<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 一样从现有解决方案中调用 OnActivatedOnDeactivated 方法。

但是,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 工具包提供两种信使实现(WeakReferenceMessengerStrongReferenceMessenger,请参阅此处的文档),这些实现提供类似的功能,下面详细介绍一些主要差异。

下面是在当前解决方案中使用时需要执行的迁移列表。

此处的第一个更改是交换组件中的 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