[.NET 8] Windows Forms (No Designer) + Generic Host + Dependency Injection + MVVM + Command 패턴을 하나의 소스 파일로 묶어봤습니다.

.NET 8에 들어오면서, Windows Forms에서도 ICommand 기반의 MVVM 패턴을 완전히 구현할 수 있게 되었죠

그래서, Windows Forms에서도 Generic Host를 시작으로 Dependency Injection, MVVM, Command 패턴을 빠짐없이 사용할 수 있는지 살펴보았고, 코드 작성 난이도가 다소 높긴 하나 충분히 해볼만한 것 같습니다. 여기에 맞추어 샘플 코드를 만들어봤습니다.

관심있으신 분들께 참고가 될만한 레퍼런스 코드를 GitHub Gist로 공유해봅니다. :smiley:

10 Likes

확실히 Windows Forms는 오래된 코드베이스여서 그런지 이 예제의 테마에 맞추어 코드를 작성할 때 생각보다 타이핑해야 할 코드의 양이 제법 많은 편입니다.

그래서 코드를 간결하게 만들어줄 익스텐션 메서드가 잘 쓰일 필요가 있겠다는 생각도 듭니다.

6 Likes

기왕이면 Button에 Command를 직접 지정하는 것 보다 DataBindings에 Binding을 추가하시면 더욱 멋진 예제가 되지 않을까 싶습니다.

// 확인 버튼 추가
var okayButton = new Button()
{
    Parent = buttonPanel,
    Text = "OK",
    DialogResult = DialogResult.OK,
    AutoSize = true,
    //Command = _viewModel.AcceptCommand,
    //CommandParameter = _viewModel,
};
okayButton.DataBindings.Add(new Binding(
    nameof(okayButton.Command),
    DataContext,
    nameof(_viewModel.AcceptCommand),
    true,
    DataSourceUpdateMode.OnPropertyChanged
));
this.AcceptButton = okayButton;

// 취소 버튼 추가
var cancelButton = new Button()
{
    Parent = buttonPanel,
    Text = "Cancel",
    DialogResult = DialogResult.Cancel,
    AutoSize = true,
    //Command = _viewModel.CancelCommand,
    //CommandParameter = _viewModel,
};
cancelButton.DataBindings.Add(new Binding(
    nameof(cancelButton.Command),
    DataContext,
    nameof(_viewModel.CancelCommand),
    true,
    DataSourceUpdateMode.OnPropertyChanged
));

4 Likes

이런걸 원했는데 윈품이군요 …ㅜㅜㅜ wpf 는 없을까요…

1 Like

시간되면 WPF 버전도 샘플 만들어보겠습니다. ㅎㅎ

2 Likes