本文概述 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 專屬
DialogServiceDispatcherHelperNavigationService
Android/iOS 專屬
ActivityBaseBindingBindingModePropertyChangedEventManagerUpdateTriggerMode
Android 專用
CachingViewHolderObservableAdapterObservableRecyclerAdapter
iOS 專屬
ObservableCollectionViewSourceObservableTableViewControllerObservableTableViewSource
協助者
EmptyWeakActionWeakFunc