본문 바로가기
WPF

WPF MVVM에서 Window Close 호출 방법

by leo21c 2025. 4. 23.

WPF MVVM에서 Window를 닫는 방법은 MVVM 패턴을 유지하면서 ViewModel에서 닫기 동작을 제어하는 방식으로 구현할 수 있습니다. 아래는 일반적인 접근 방법입니다:

1. Action을 활용한 Window 닫기

ViewModel에서 Action을 정의하고, View에서 이를 설정한 후 ViewModel에서 호출하는 방식입니다.

ViewModel

public Action CloseAction { get; set; }

public ICommand CloseCommand { get; }

public ViewModel()
{
    CloseCommand = new RelayCommand(ExecuteClose);
}

private void ExecuteClose()
{
    CloseAction?.Invoke(); // View에서 설정된 Close 메서드 호출
}

 

View (Code-Behind)

public MainWindow()
{
    InitializeComponent();
    var viewModel = new ViewModel();
    DataContext = viewModel;

    // ViewModel의 CloseAction에 Window 닫기 동작 연결
    viewModel.CloseAction = new Action(this.Close);
}

 

2. Messenger를 활용한 Window 닫기

MVVM Light Toolkit과 같은 라이브러리의 Messenger를 사용하여 ViewModel에서 메시지를 보내고 View에서 이를 처리하는 방식입니다.

ViewModel

public ICommand CloseCommand { get; }

public ViewModel()
{
    CloseCommand = new RelayCommand(() => Messenger.Default.Send(new NotificationMessage("CloseWindow")));
}

 

View (Code-Behind)

public MainWindow()
{
    InitializeComponent();
    Messenger.Default.Register<NotificationMessage>(this, message =>
    {
        if (message.Notification == "CloseWindow")
        {
            this.Close();
        }
    });
}

 

3. DialogResult를 활용한 닫기

Window.DialogResult를 설정하여 창을 닫는 방법입니다. 이 방법은 주로 Modal Dialog에서 사용됩니다.

ViewModel

public ICommand CloseCommand { get; }

public ViewModel()
{
    CloseCommand = new RelayCommand(() => DialogResult = true);
}

public bool? DialogResult { get; set; }

 

View (Code-Behind)

public MainWindow()
{
    InitializeComponent();
    var viewModel = new ViewModel();
    DataContext = viewModel;

    // DialogResult를 ViewModel에서 설정 가능하도록 연결
    viewModel.DialogResult = new Func<bool?>(() => this.DialogResult);
}

 

이 방법들 중 프로젝트의 요구사항에 맞는 방식을 선택하면 됩니다.

LIST