CommunityToolkit.Mvvm

CommunityToolkit.Mvvm은 Microsoft에서 제공하는 경량의 MVVM(Model-View-ViewModel) 프레임워크로, WPF, UWP, WinUI, MAUI와 같은 XAML 기반 애플리케이션 개발에서 MVVM 패턴을 더 쉽게 구현할 수 있도록 도와줍니다.

CommunityToolkit.Mvvm의 주요 특징

ObservableObjectINotifyPropertyChanged 지원

INotifyPropertyChanged를 구현하는 반복 작업을 줄여줍니다.

  • 기존 코드:

    public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        private string _name;
        public string Name
        {
            get => _name;
            set
            {
                if (_name != value)
                {
                    _name = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));
                }
            }
        }
    }
  • CommunityToolkit.Mvvm 사용:

    using CommunityToolkit.Mvvm.ComponentModel;
    
    public partial class ViewModel : ObservableObject
    {
        [ObservableProperty]
        private string name;
    }
  • [ObservableProperty]를 사용하면 자동으로 PropertyChanged 이벤트가 생성됩니다.


RelayCommand로 간편한 ICommand 생성

MVVM에서 자주 사용되는 ICommand를 간단히 생성합니다.

  • 기존 코드:

    public ICommand SubmitCommand { get; }
    
    public ViewModel()
    {
        SubmitCommand = new RelayCommand(Submit);
    }
    
    private void Submit()
    {
        // 명령 로직
    }
  • CommunityToolkit.Mvvm 사용:

    using CommunityToolkit.Mvvm.Input;
    
    public partial class ViewModel : ObservableObject
    {
        [RelayCommand]
        private void Submit()
        {
            // 명령 로직
        }
    }
  • [RelayCommand]를 사용하면 SubmitCommand가 자동 생성됩니다.


ObservableValidator로 데이터 유효성 검증

ObservableValidatorObservableObject를 기반으로 추가적인 유효성 검사 기능을 제공합니다.

using CommunityToolkit.Mvvm.ComponentModel;
using System.ComponentModel.DataAnnotations;
public partial class FormViewModel : ObservableValidator
{
    [ObservableProperty]
    [Required(ErrorMessage = "Name is required")]
    private string name;
    [ObservableProperty]
    [Range(18, 99, ErrorMessage = "Age must be between 18 and 99")]
    private int age;
    public void ValidateAll()
    {
        ValidateAllProperties();
    }
}
  • 자동 검증: 속성 변경 시 자동으로 유효성 검사를 실행합니다.
  • 에러 메시지 관리: GetErrors 메서드로 유효성 검사 결과를 확인할 수 있습니다.

Message Handling with WeakReferenceMessenger

View와 ViewModel 간의 메시지를 전달할 수 있는 강력한 메시지 전달 도구를 제공합니다.

using CommunityToolkit.Mvvm.Messaging;
public class UpdateMessage : IMessage { }
public class Sender
{
    public void SendMessage()
    {
        WeakReferenceMessenger.Default.Send(new UpdateMessage());
    }
}
public class Receiver
{
    public Receiver()
    {
        WeakReferenceMessenger.Default.Register<UpdateMessage>(this, (r, m) =>
        {
            Console.WriteLine("Message Received");
        });
    }
}
  • 메모리 누수 방지: 메시지를 Weak Reference로 관리하여 메모리 누수를 방지합니다.

Task 기반 비동기 명령 지원

ICommand를 비동기적으로 실행할 수 있도록 AsyncRelayCommand를 제공합니다.

using CommunityToolkit.Mvvm.Input;
public partial class ViewModel : ObservableObject
{
    [RelayCommand]
    private async Task LoadDataAsync()
    {
        await Task.Delay(1000); // 비동기 작업
    }
}

장점

경량

  • CommunityToolkit.Mvvm는 단순하면서도 효율적입니다. Prism이나 Caliburn.Micro와 같은 무거운 MVVM 프레임워크보다 가볍습니다.

Microsoft 공식 지원

  • Microsoft에서 개발하고 관리하므로 신뢰성과 지속적인 업데이트를 기대할 수 있습니다.

소스 생성기 활용

  • C#의 최신 소스 생성기 기능을 활용하여 컴파일 시간에 중복 코드를 생성합니다. 성능에도 유리합니다.

학습 곡선이 낮음

  • 기존 MVVM 개념을 알고 있다면 빠르게 적응할 수 있습니다.

유효성 검사 및 메시지 전달 통합

  • 데이터를 검증하거나 ViewModel 간 메시지를 전달하는 기능이 포함되어 있어 외부 라이브러리 의존성이 적습니다.

단점

심플하지만 제한적

  • 복잡한 시나리오를 지원하는 Prism 또는 Caliburn.Micro 같은 강력한 기능이 필요하다면 부족할 수 있습니다.

XAML 기반 MVVM 전용

  • 비 XAML UI 기술(예: WinForms, Console 애플리케이션)에는 적용하기 어렵습니다.

소스 생성기 사용 필요

  • 소스 생성기 기능이 C# 최신 버전에 의존하므로, .NET 5 이상에서만 완전히 활용할 수 있습니다.

CommunityToolkit.Mvvm 사용이 적합한 경우

  • 가벼운 MVVM 프레임워크를 찾고 있을 때
  • 작거나 중간 규모의 프로젝트
  • WPF, UWP, MAUI 또는 WinUI 기반 프로젝트
  • .NET 최신 버전 사용 가능