從 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" />

遷移可觀察物件

以下步驟著重於遷移您現有的元件,也就是那些運用 MvvmLight Toolkit 的 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);

請注意,若方法是從屬性的設定器呼叫,因為該方法是從呼叫者成員名稱推斷出來的,則不需要參數 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) 沒有直接的替代者。

建議為提升效能,將 RaisePropertyChanged<T>(Expression) 改以 Toolkit 的 OnPropertyChanged(string) 搭配 nameof 關鍵字取代(或者若目標屬性與呼叫此方法的屬性相同,則可不帶參數,這樣便可如上所述自動推斷名稱)。

// 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 Toolkit 的 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) 沒有直接的替代者。

建議為提升效能,建議你改用 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));

請注意,呼叫 Broadcast 方法時透過 Messenger 屬性傳送的訊息,在 MVVM Toolkit 程式庫中有可直接取代 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 工具包中呼叫時,也會取消註冊所有已註冊的 Messenger 事件。

// 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 工具包中標準的弱參考信使實作。 這只要將不同的 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

遷移中繼指揮部

以下步驟著重於遷移您現有採用 MvvmLight Toolkit 的 RelayCommand 元件。

MVVM 工具組提供一個 RelayCommand 類型,利用 ICommand System 介面提供對等功能。

以下是若在目前解決方案中使用時,需要執行的遷移清單。 若未列出某個方法或屬性,則在 MVVM 工具包中會直接以同名替換,且無需更改。

這裡的第一個改變是用元件中的指令來交換。

// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;

// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;

備註

MvvmLight 利用弱參考來建立指令與相關類別所呼叫動作之間的連結。 這並非 MVVM Toolkit 實作所要求,若此可選參數在任何建構子中被設定為 , true 將會被移除。

使用 RelayCommand 搭配非同步作業

如果你目前使用 MvvmLight RelayCommand 實作搭配非同步動作,MVVM 工具包會提供針對這些情境的改良實作。

你可以直接用為非同步用途而建置的AsyncRelayCommand來取代你現有的RelayCommand。

// 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>

以下步驟著重於遷移您現有採用 MvvmLight Toolkit 的 RelayCommand<T> 元件。

MVVM 工具包提供一種 RelayCommand<T> 類型,可利用 ICommand System 介面提供對應的等效功能。

以下是若在目前解決方案中使用時,需要執行的遷移清單。 若未列出某個方法或屬性,則在 MVVM 工具包中會直接以同名替換,且無需更改。

這裡的第一個改變是用元件中的指令來交換。

// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;

// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;

使用 RelayCommand 搭配非同步操作

如果你目前使用 MvvmLight RelayCommand<T> 實作搭配非同步動作,MVVM 工具包會提供針對這些情境的改良實作。

你可以直接以專為非同步用途而建置的 AsyncRelayCommand<T> 取代現有的 RelayCommand<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());
}

解決相依關係

一旦初始化,服務即可從Ioc類別中檢索,就像:SimpleIoc

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 工具包提供兩種 messenger 實作(WeakReferenceMessenger 與 StrongReferenceMessenger,詳見 此處文件),功能相似,以下將說明一些主要差異。

以下是若在目前解決方案中使用時,需要執行的遷移清單。

這裡的第一個改變是用元件中的指令來交換。

// MvvmLight
using GalaSoft.MvvmLight.Messaging;

// MVVM Toolkit
using CommunityToolkit.Mvvm.Messaging;

信使方法

Register<TMessage>(object, Action<TMessage>)

Register<TMessage>(object, Action<TMessage>) 的功能可透過 MVVM 工具組的 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 ,但要小心確保程式碼沒有擷取任何東西。

此外,這個範例和以下的例子將僅使用 Messenger 來自 ObservableRecipient的性質。 如果你想從程式碼中的其他位置以靜態方式存取 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 Toolkit 的 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)

Send<TMessage>(TMessage) 的功能可透過 MVVM Toolkit 的 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)

Unregister<TMessage>(object) 的功能可透過 MVVM 工具組的 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 Toolkit 的 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 Toolkit 的方法 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 的實作會將實例歸零不同,MVVM 工具包會清除已註冊的映射。

// MvvmLight
Messenger.Default.ResetAll();

// MVVM Toolkit
Messenger.Reset();

Messenger 靜態方法

OverrideDefault(IMessenger)

MVVM 工具包中沒有直接取代此 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();

信使靜態特性

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