ViewModelBase 클래스 / RelayCommand 클래스

00·2025년 1월 19일

개요

ViewModelBase 클래스와 RelayCommand 클래스는 MVVM 패턴을 구현할 때 자주 사용되는 유용한 클래스들이다. 이들을 사용하면 코드를 더 간결하고 효율적으로 작성할 수 있다.

ViewModelBase 클래스

  • INotifyPropertyChanged 인터페이스 구현: ViewModelBase 클래스는 INotifyPropertyChanged 인터페이스를 구현하여 ViewModel의 속성 값이 변경될 때 View에 알림을 전달하는 역할을 한다. 이를 통해 View는 ViewModel의 변경 사항을 자동으로 반영하여 UI를 업데이트할 수 있다.
  • 속성 변경 알림: ViewModelBase 클래스는 OnPropertyChanged() 메서드를 제공하여 속성 변경 알림을 발생시킨다. ViewModel에서 속성 값을 변경할 때마다 OnPropertyChanged() 메서드를 호출하면 View에 변경 사항이 전달된다.
  • 코드 중복 제거: ViewModelBase 클래스를 사용하면 모든 ViewModel에서 INotifyPropertyChanged 인터페이스를 구현하고 OnPropertyChanged() 메서드를 작성해야 하는 번거로움을 줄일 수 있다.

RelayCommand 클래스

  • ICommand 인터페이스 구현: RelayCommand 클래스는 ICommand 인터페이스를 구현하여 View에서 ViewModel의 메서드를 실행할 수 있도록 하는 Command를 구현하는 역할을 한다.
  • 메서드 실행: RelayCommand 객체를 생성할 때 ViewModel의 메서드를 인자로 전달하면, View에서 해당 Command를 실행할 때 전달된 메서드가 호출된다.
  • CanExecute: RelayCommandCanExecute() 메서드를 통해 Command 실행 가능 여부를 제어할 수 있다. 예를 들어, 특정 조건을 만족해야만 버튼이 활성화되도록 할 수 있다.
  • 코드 간결화: RelayCommand 클래스를 사용하면 View에서 이벤트 핸들러를 작성하지 않고도 ViewModel의 메서드를 직접 실행할 수 있어 코드가 간결해진다.

요약

  • ViewModelBase 클래스는 INotifyPropertyChanged 인터페이스를 구현하여 ViewModel의 속성 변경 알림을 View에 전달하는 역할을 한다.
  • RelayCommand 클래스는 ICommand 인터페이스를 구현하여 View에서 ViewModel의 메서드를 실행할 수 있도록 하는 Command를 구현하는 역할을 한다.
  • 이들을 사용하면 MVVM 패턴을 더욱 효과적으로 구현하고 코드를 간결하게 유지할 수 있다.

사용 방법

  1. ViewModelBase 클래스 상속: ViewModel 클래스에서 ViewModelBase 클래스를 상속받습니다.
  2. OnPropertyChanged() 호출: ViewModel에서 속성 값이 변경될 때마다 OnPropertyChanged() 메서드를 호출하여 View에 변경 사항을 알립니다.
  3. RelayCommand 생성: ViewModel에서 RelayCommand 객체를 생성하고, 실행할 메서드를 인자로 전달합니다.
  4. Command 바인딩: View에서 RelayCommand 객체를 컨트롤 (예: Button)의 Command 속성에 바인딩합니다.

예시 코드

// ViewModel
public class MyViewModel : ViewModelBase
{
    private string _myText;

    public string MyText
    {
        get { return _myText; }
        set 
        { 
            _myText = value; 
            OnPropertyChanged(); 
        }
    }

    public ICommand MyCommand { get; private set; }

    public MyViewModel()
    {
        MyCommand = new RelayCommand(ExecuteMyCommand);
    }

    private void ExecuteMyCommand()
    {
        // Command 실행 시 수행할 작업
        MyText = "Command Executed!";
    }
}

// View
<Button Content="Execute Command" Command="{Binding MyCommand}" />

다른 방법

앞에서 설명한 것처럼 ViewModelBase 클래스와 RelayCommand 클래스를 직접 구현하는 대신 사용할 수 있는 방법이 있다. .NET Community Toolkit MVVM 라이브러리 또는 다른 MVVM 프레임워크를 활용하면 MVVM 패턴을 더욱 쉽고 효율적으로 적용할 수 있다.

1. .NET Community Toolkit MVVM 라이브러리 활용

.NET Community Toolkit은 MVVM 패턴 구현을 위한 다양한 유틸리티를 제공하는 라이브러리다. 이 라이브러리에는 ObservableObject 클래스와 RelayCommand 클래스가 포함되어 있어, ViewModelBase 클래스와 RelayCommand 클래스를 직접 구현하지 않고도 MVVM 패턴을 쉽게 적용할 수 있다.

ObservableObject 클래스

  • INotifyPropertyChanged 인터페이스를 구현한 클래스이다.
  • ViewModel에서 ObservableObject 클래스를 상속받으면 속성 변경 알림을 자동으로 처리할 수 있다.
  • [ObservableProperty] 어트리뷰트를 사용하여 속성을 정의하면, 속성 변경 이벤트를 자동으로 발생시키는 코드가 생성된다.

RelayCommand 클래스

  • ICommand 인터페이스를 구현한 클래스이다.
  • [RelayCommand] 어트리뷰트를 사용하여 메서드를 Command로 변환할 수 있다.
  • CanExecute 메서드를 지정하여 Command 실행 가능 여부를 제어할 수 있다.

사용 방법

  1. NuGet 패키지 설치: NuGet 패키지 관리자에서 CommunityToolkit.Mvvm 패키지를 설치한다.
  2. ObservableObject 상속: ViewModel 클래스에서 ObservableObject 클래스를 상속받는다.
  3. ObservableProperty 어트리뷰트 사용: [ObservableProperty] 어트리뷰트를 사용하여 속성을 정의한다.
  4. RelayCommand 어트리뷰트 사용: [RelayCommand] 어트리뷰트를 사용하여 메서드를 Command로 변환한다.

예시 코드

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

public class MyViewModel : ObservableObject
{
    [ObservableProperty]
    private string _myText;

    [RelayCommand]
    private void ExecuteMyCommand()
    {
        MyText = "Command Executed!";
    }
}

2. 기타 MVVM 프레임워크 활용

.NET Community Toolkit MVVM 외에도 Prism, MVVM Light, Caliburn.Micro 등 다양한 MVVM 프레임워크가 있다. 이러한 프레임워크들은 ViewModelBase 클래스, RelayCommand 클래스, 의존성 주입, 메시징 등 MVVM 패턴 구현을 위한 다양한 기능을 제공한다.

장점:

  • 편리한 기능: MVVM 패턴 구현을 위한 다양한 기능을 제공한다.
  • 코드 간결화: ViewModelBase 클래스와 RelayCommand 클래스를 직접 구현할 필요가 없다.
  • 생산성 향상: MVVM 패턴을 빠르고 효율적으로 적용할 수 있다.

단점:

  • 학습 곡선: 프레임워크의 기능을 익히는 데 시간이 필요할 수 있다.
  • 프로젝트 의존성: 외부 라이브러리에 대한 의존성이 생긴다.

어떤 방법 쓸까?

  • .NET Community Toolkit MVVM: 간단한 MVVM 패턴 구현에 적합하다.
  • MVVM 프레임워크: 복잡한 MVVM 패턴 구현이나 대규모 프로젝트에 적합하다.

참조

CommunityToolkit.Mvvm
https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/

0개의 댓글