» [WPF] MVVM 관련 프레임워크

[WPF] MVVM 관련 프레임워크

by DUBUKIMCH

WPF의 MVVM 프레임워크는 각각의 장단점과 특징이 있으며, DelegateCommand, ViewModelBase, Prism, MVVM Light, Caliburn.Micro를 활용하면 MVVM 패턴을 더 효과적으로 구현할 수 있습니다. 아래에서 각 개념과 프레임워크에 대한 설명과 간단한 예시를 제시합니다.

1. DelegateCommand

DelegateCommand는 MVVM에서 ICommand를 구현하여 Command Binding을 지원하는 클래스입니다. 이를 통해 버튼 클릭 등 이벤트를 ViewModel의 명령 로직과 연결합니다.

  • Prism에서 제공하는 DelegateCommand는 Execute와 CanExecute 메서드를 람다로 정의할 수 있어 간단하고 효율적입니다.

예제 코드

using Prism.Commands;
using System.Windows.Input;

public class MainViewModel
{
    public ICommand MyCommand { get; }

    public MainViewModel()
    {
        MyCommand = new DelegateCommand(OnExecute, CanExecute);
    }

    private void OnExecute()
    {
        // 명령 실행 로직
        System.Diagnostics.Debug.WriteLine("Command Executed!");
    }

    private bool CanExecute()
    {
        // 실행 가능 여부
        return true;
    }
}

XAML

<Button Content="Click Me" Command="{Binding MyCommand}" />

2. ViewModelBase

ViewModelBase는 MVVM의 ViewModel 클래스가 상속받는 기본 클래스입니다. 주로 INotifyPropertyChanged를 구현하여 데이터 바인딩 시 UI 업데이트를 지원합니다.

간단한 구현 예제

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class MainViewModel : ViewModelBase
{
    private string _message;
    public string Message
    {
        get => _message;
        set
        {
            _message = value;
            OnPropertyChanged();
        }
    }
}

XAML

<TextBox Text="{Binding Message, UpdateSourceTrigger=PropertyChanged}" />

3. Prism

Prism은 모듈식 애플리케이션 개발과 MVVM 패턴을 지원하는 강력한 프레임워크입니다. DelegateCommand, EventAggregator, RegionManager 등을 제공합니다.

예제 코드 (DelegateCommand와 함께 사용)

using Prism.Mvvm;
using Prism.Commands;

public class MainViewModel : BindableBase
{
    private string _message;
    public string Message
    {
        get => _message;
        set => SetProperty(ref _message, value);
    }

    public DelegateCommand UpdateMessageCommand { get; }

    public MainViewModel()
    {
        UpdateMessageCommand = new DelegateCommand(UpdateMessage);
    }

    private void UpdateMessage()
    {
        Message = "Hello, Prism!";
    }
}

XAML

<TextBox Text="{Binding Message, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="Update Message" Command="{Binding UpdateMessageCommand}" />

4. MVVM Light

MVVM Light는 경량 프레임워크로, MVVM을 간단히 구현하기 위한 클래스와 도구를 제공합니다.
주요 클래스는 RelayCommand와 ViewModelBase입니다.

예제 코드

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;

public class MainViewModel : ViewModelBase
{
    private string _message;
    public string Message
    {
        get => _message;
        set => Set(ref _message, value);
    }

    public RelayCommand ShowMessageCommand { get; }

    public MainViewModel()
    {
        ShowMessageCommand = new RelayCommand(ShowMessage);
    }

    private void ShowMessage()
    {
        Message = "Hello from MVVM Light!";
    }
}

XAML

<TextBox Text="{Binding Message, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="Show Message" Command="{Binding ShowMessageCommand}" />

5. Caliburn.Micro

Caliburn.Micro는 MVVM 패턴을 효율적으로 구현하기 위한 프레임워크로, Convention over Configuration 철학을 따릅니다.
View와 ViewModel 간의 매핑과 커맨드 연결이 자동으로 이루어지는 점이 특징입니다.

예제 코드

using Caliburn.Micro;

public class MainViewModel : Screen
{
    private string _message;
    public string Message
    {
        get => _message;
        set
        {
            _message = value;
            NotifyOfPropertyChange(() => Message);
        }
    }

    public void ShowMessage()
    {
        Message = "Hello, Caliburn.Micro!";
    }
}

XAML

<TextBox Text="{Binding Message}" />
<Button Content="Show Message" x:Name="ShowMessage" />
  • 버튼의 x:Name 속성이 ShowMessage와 동일한 메서드 이름을 자동으로 매핑합니다.

비교 요약

프레임워크주요 특징장점단점
DelegateCommandICommand 인터페이스의 간단한 구현체간단한 사용법외부 라이브러리에 의존할 수 있음
Prism모듈식 애플리케이션 개발에 적합, DelegateCommand와 RegionManager 제공대규모 프로젝트에 적합학습 곡선이 있음
MVVM LightRelayCommand와 간단한 ViewModelBase 제공경량화 및 빠른 학습 가능유지보수가 중단됨 (현재는 사용 줄어듦)
Caliburn.MicroConvention over Configuration, 자동 매핑 지원설정 없이도 자동화된 바인딩 가능고급 기능 학습 필요

필요에 따라 위의 프레임워크 중 하나를 선택해 프로젝트에 활용하면 됩니다.

You may also like

Leave a Comment

error: Content is protected !!