MvvmLight에서 마이그레이션
이 문서에서는 마이그레이션을 용이하게 하기 위해 MvvmLight 도구 키트와 MVVM 도구 키트 간의 몇 가지 주요 차이점을 간략하게 설명합니다.
이 문서에서는 특히 MvvmLight에서 MVVM 도구 키트로의 마이그레이션에 중점을 두고 있지만 MVVM 도구 키트 내에서 추가적인 개선 사항이 있으므로 개별 새 API에 대한 설명서를 살펴보는 것이 좋습니다.
플랫폼 API:, ,
ObservableRecipient
,RelayCommand
,AsyncRelayCommand
RelayCommand<T>
,AsyncRelayCommand<T>
,IMessenger
,WeakReferenceMessenger
StrongReferenceMessenger
IRecipient<TMessage>
,MessageHandler<TRecipient, TMessage>
ObservableObject
IMessengerExtensions
MVVM 도구 키트 설치
MVVM 도구 키트를 활용하려면 먼저 기존 .NET 애플리케이션에 최신 NuGet 패키지를 설치해야 합니다.
.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);
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)
에는 직접 교체가 없습니다.
대신 키워드(keyword) 사용하여 nameof
도구 키트 OnPropertyChanged(string)
로 바꾸는 RaisePropertyChanged<T>(Expression)
향상된 성능을 위해 권장됩니다(또는 대상 속성이 메서드를 호출하는 것과 같으면 매개 변수가 없으므로 위에서 멘션 대로 이름을 자동으로 유추할 수 있습니다).
// MvvmLight
RaisePropertyChanged(() => MyProperty);
// MVVM Toolkit
OnPropertyChanged(nameof(MyProperty));
VerifyPropertyName(string)
메서드를 VerifyPropertyName(string)
직접 대체하지 않으며 이를 사용하는 모든 코드를 변경하거나 제거해야 합니다.
MVVM 도구 키트에서 누락되는 이유는 속성에 키워드(keyword) 사용하면 nameof
해당 속성이 있는지 확인하기 때문입니다. MvvmLight를 빌드 nameof
할 때 키워드(keyword) 사용할 수 없으며 이 메서드를 사용하여 개체에 속성이 있는지 확인했습니다.
// 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
또한 기본 ObservableObject
클래스의 메서드와 마찬가지로 호출자 멤버 이름에서 유추되므로 속성의 setter에서 메서드를 호출하는 경우에는 매개 변수가 필요하지 않습니다.
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)
에는 직접 교체가 없습니다.
성능 향상을 위해 대신 키워드(keyword) 사용하는 nameof
MVVM 도구 키트 SetProperty<T>(ref T, T, bool, string)
로 바꾸는 것이 좋습니다.
// 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 도구 키트 라이브러리 내에서 직접 대체 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
.와 동일한 기능을 제공하는 데 사용해야 하는 메서드를 Cleanup
제공합니다OnDeactivated
.
OnDeactivated
또한 MVVM 도구 키트에서 호출될 때 등록된 모든 메신저 이벤트의 등록을 취소합니다.
// MvvmLight
Cleanup();
// MVVM Toolkit
OnDeactivated();
참고로 OnActivated
기존 솔루션Cleanup
에서 메서드 및 OnDeactivated
메서드를 호출할 수 있습니다.
그러나 ObservableRecipient
설정 시 이러한 메서드에 대한 호출도 제어하는 속성을 노출 IsActive
합니다.
ViewModelBase 속성
MessengerInstance
MessengerInstance
에는 이름이 바뀐 직접 대체가 있습니다 Messenger
.
// MvvmLight
IMessenger messenger = MessengerInstance;
// MVVM Toolkit
IMessenger messenger = Messenger;
참고 항목
속성 WeakReferenceMessenger.Default
의 Messenger
기본값은 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
RelayCommand 마이그레이션
다음 단계에서는 MvvmLight 도구 키트를 활용하는 RelayCommand
기존 구성 요소를 마이그레이션하는 데 집중합니다.
MVVM 도구 키트는 시스템 인터페이스를 RelayCommand
활용하는 유사 기능을 제공하는 형식을 ICommand
제공합니다.
다음은 현재 솔루션에서 사용되는 경우 수행해야 하는 마이그레이션 목록입니다. 메서드 또는 속성이 나열되지 않은 경우 MVVM 도구 키트에 이름이 같은 직접 대체가 있으며 변경이 필요하지 않습니다.
여기서 첫 번째 변경 내용은 구성 요소의 지시문을 사용하여 교환하는 것입니다.
// MvvmLight
using GalaSoft.MvvmLight.Command;
using Galasoft.MvvmLight.CommandWpf;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Input;
참고 항목
MvvmLight는 약한 참조를 사용하여 명령과 연결된 클래스에서 호출된 작업 간에 연결을 설정합니다. 이는 MVVM 도구 키트 구현에서 필요하지 않으며 이 선택적 매개 변수가 생성자에서 설정된 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 도구 키트에 이름이 같은 직접 대체가 있으며 변경이 필요하지 않습니다.
여기서 첫 번째 변경 내용은 구성 요소의 지시문을 사용하여 교환하는 것입니다.
// 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 도구 키트의 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 도구 키트 Ioc
구현을 사용하여 종속성을 제거하기 위한 직접적인 대체는 없습니다.
기본 설정 생성자
MvvmLight's SimpleIoc
에 종속성을 등록할 때 클래스에서 여러 생성자가 있는 사용자에 대한 특성을 제공하는 PreferredConstructor
옵션이 있습니다.
이 특성은 사용되는 위치를 제거해야 하며, 지원되는 경우 사용 중인 타사 종속성 주입 라이브러리의 특성을 사용해야 합니다.
마이그레이션 Messenger
다음 단계에서는 MvvmLight 도구 키트를 활용하는 Messenger
기존 구성 요소를 마이그레이션하는 데 집중합니다.
MVVM 도구 키트는 아래에 설명된 몇 가지 주요 차이점과 함께 유사한 기능을 제공하는 두 개의 메신저 구현(WeakReferenceMessenger
및 StrongReferenceMessenger
여기에 설명된 문서 참조)을 제공합니다.
다음은 현재 솔루션에서 사용되는 경우 수행해야 하는 마이그레이션 목록입니다.
여기서 첫 번째 변경 내용은 구성 요소의 지시문을 사용하여 교환하는 것입니다.
// MvvmLight
using GalaSoft.MvvmLight.Messaging;
// MVVM Toolkit
using CommunityToolkit.Mvvm.Messaging;
Messenger 메서드
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));
이 서명의 이유는 메신저가 약한 참조를 사용하여 받는 사람을 제대로 추적하고 받는 사람 자체를 캡처하기 위해 폐쇄를 만들지 않도록 할 수 있기 때문입니다. 즉, 입력 받는 사람이 람다 식에 대한 입력으로 전달되므로 람다 식 자체에서 캡처할 필요가 없습니다. 또한 동일한 처리기를 할당 없이 여러 번 다시 사용할 수 있으므로 더 효율적인 코드가 생성됩니다. 이는 처리기를 등록하는 지원되는 방법 중 하나일 뿐이며, 대신(메신저 문서에 자세히 설명되어 있음) 인터페이스를 사용할 IRecipient<TMessage>
수 있으므로 등록이 자동적이고 자세한 정보 표시가 줄어듭니다.
참고 항목
static
람다 식의 한정자는 C# 9가 필요하며 선택 사항입니다. 받는 사람 또는 다른 멤버를 실수로 캡처하지 않도록 하기 위해 여기에서 사용하는 것이 유용하므로 폐쇄 할당이 발생하지만 필수는 아닙니다. C# 9를 사용할 수 없는 경우 여기에서 제거하고 static
코드가 아무것도 캡처하지 않도록 주의해야 합니다.
또한 이 예제와 아래 예제에서는 해당 속성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 도구 키트의 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 도구 키트의 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 도구 키트의 Reset()
메서드를 사용하여 수행할 수 있습니다.
인스턴스를 null로 제거하는 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
메서드를 직접 대체할 수 없습니다.
메신저 유형 중 하나의 정적 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 도구 키트 구현에서는 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
MVVM Toolkit