共用方式為


從MvvmLight移轉

本文概述MvvmLight工具組與MVVM工具組之間的一些主要差異,以簡化您的移轉。

雖然本文特別著重於從MvvmLight移轉至MVVM工具組,但請注意MVVM工具組內已進行的其他改進,因此強烈建議您查看個別新 API 的檔。

平臺 API:ObservableObjectAsyncRelayCommandRelayCommandAsyncRelayCommand<T>IMessengerObservableRecipientRelayCommand<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

不過,會ObservableRecipientIsActive公開屬性,這個屬性也會在設定時控制對這些方法的呼叫。

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 實作(WeakReferenceMessengerStrongReferenceMessenger,請參閱 這裡的檔),提供類似的功能,並詳細說明一些主要差異。

以下是在目前解決方案中使用時必須執行的移轉清單。

這裡的第一個變更會交換元件中的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