本文概述MvvmLight工具組與MVVM工具組之間的一些主要差異,以簡化您的移轉。
雖然本文特別著重於從MvvmLight移轉至MVVM工具組,但請注意MVVM工具組內已進行的其他改進,因此強烈建議您查看個別新 API 的檔。
平臺 API:
ObservableObject
、AsyncRelayCommand
RelayCommand
AsyncRelayCommand<T>
IMessenger
ObservableRecipient
RelayCommand<T>
、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
如果方法是從屬性的 setter 呼叫,因為從呼叫端成員名稱推斷,就不需要 參數,如這裡所示。 如果您想要 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
工具組OnPropertyChanged(string)
的 關鍵詞取代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
下列步驟著重於移轉利用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
如果方法是從屬性的 setter 呼叫,因為從呼叫端成員名稱推斷,就不需要 參數,就像基類中的 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
的訊息會直接取代 PropertyChangedMessage
MVVM Toolkit 連結庫中的 。
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 Toolkit 中標準弱式參考信使實作。 只要將不同的 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 Toolkit 實作不需要此專案,而且如果您的任何建構函式中已將這個選擇性參數設定為 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()
RaiseCanExecuteChanged()
的功能可以使用MVVM工具組的 NotifyCanExecuteChanged()
方法達成。
// 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()
RaiseCanExecuteChanged()
的功能可以使用MVVM工具組的 NotifyCanExecuteChanged()
方法達成。
// MvvmLight
var command = new RelayCommand<string>(OnCommand);
command.RaiseCanExecuteChanged();
// MVVM Toolkit
var command = new RelayCommand<string>(OnCommand);
command.NotifyCanExecuteChanged();
遷移 SimpleIoc
MVVM Toolkit 中的 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工具組的現有元件 Messenger
。
MVVM 工具組提供兩個 Messenger 實作(WeakReferenceMessenger
和 StrongReferenceMessenger
,請參閱 這裡的檔),提供類似的功能,並詳細說明一些主要差異。
以下是在目前解決方案中使用時必須執行的移轉清單。
這裡的第一個變更會交換元件中的using指示詞。
// MvvmLight
using GalaSoft.MvvmLight.Messaging;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Messaging;
Messenger 方法
Register<TMessage>(object, Action<TMessage>)
Register<TMessage>(object, Action<TMessage>)
的功能可以使用MVVM Toolkit的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工具組的 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工具組的 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工具組的 UnregisterAll(object)
方法達成。
// MvvmLight
Messenger.Default.Unregister(this);
// MVVM Toolkit
Messenger.UnregisterAll(this);
Unregister<TMessage>(object)
Unregister<TMessage>(object)
的功能可以使用MVVM Toolkit的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 Toolkit的 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 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
當呼叫此方法時,類型只會執行任何動作,因為內部狀態已在使用 Messenger 時自動修剪。
// 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工具組的 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 Toolkit 中沒有靜態 Reset
方法的直接取代。
呼叫其中一個 Messenger 型別之靜態Default
實例的方法,即可達到Reset
相同的功能。
// 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
協助程式
Empty
WeakAction
WeakFunc