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
와 동일한 메서드 이름을 자동으로 매핑합니다.
비교 요약
프레임워크 | 주요 특징 | 장점 | 단점 |
---|---|---|---|
DelegateCommand | ICommand 인터페이스의 간단한 구현체 | 간단한 사용법 | 외부 라이브러리에 의존할 수 있음 |
Prism | 모듈식 애플리케이션 개발에 적합, DelegateCommand와 RegionManager 제공 | 대규모 프로젝트에 적합 | 학습 곡선이 있음 |
MVVM Light | RelayCommand와 간단한 ViewModelBase 제공 | 경량화 및 빠른 학습 가능 | 유지보수가 중단됨 (현재는 사용 줄어듦) |
Caliburn.Micro | Convention over Configuration, 자동 매핑 지원 | 설정 없이도 자동화된 바인딩 가능 | 고급 기능 학습 필요 |
필요에 따라 위의 프레임워크 중 하나를 선택해 프로젝트에 활용하면 됩니다.