从 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 类型。

此处的第一个更改是使用组件中的指令进行交换。

// 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();

请注意,OnActivatedOnDeactivated 方法可以像 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 工具包提供了两种信使实现(WeakReferenceMessengerStrongReferenceMessenger,请参阅 此处的文档),它们提供了类似的功能,但彼此之间存在一些关键差异,详见下文。

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

此处的第一个更改是使用组件中的指令进行交换。

// 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 ,并小心确保代码未捕获任何内容。

此外,本示例以及下面的示例都只会使用来自 ObservableRecipientMessenger 属性。 如果你只是想在代码中的其他任意位置静态访问 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 专用

  • DialogService
  • DispatcherHelper
  • NavigationService

Android/iOS 专用

  • ActivityBase
  • Binding
  • BindingMode
  • PropertyChangedEventManager
  • UpdateTriggerMode

Android 专用

  • CachingViewHolder
  • ObservableAdapter
  • ObservableRecyclerAdapter

iOS 特有

  • ObservableCollectionViewSource
  • ObservableTableViewController
  • ObservableTableViewSource

Helpers

  • Empty
  • WeakAction
  • WeakFunc