WPF OpenCV 프로젝트 #4: MainViewModel 및 RelayCommand 구현 (MVVM)

지난 포스팅에서 OpenCVService(Model)를 구현했으니, 이제 WPF OpenCV 프로젝트의 화면(View)과 로직을 연결해 줄 ViewModel을 작성할 차례입니다.

MVVM 패턴에서 ViewModelView(화면)가 보여줄 데이터를 가지고 있고, Model(서비스)에게 복잡한 연산을 시키는 ‘사령관’ 역할을 합니다.

MainViewModel 구조와 역할

MainViewModel.cs는 UI 요소들과 데이터 바인딩(Binding) 되어야 하므로, 값이 바뀌면 화면에 즉시 알려주는 INotifyPropertyChanged 인터페이스를 상속받아 구현합니다.

이 클래스에는 다음과 같은 핵심 기능이 포함됩니다.

  • 이미지 데이터: 화면에 표시될 DisplayImage.
  • 상태 변수: 원본 보기 체크(ShowOriginal), 로딩 중 표시(IsBusy).
  • 알고리즘 선택: 콤보박스에 바인딩될 AlgorithmList와 선택된 SelectedAlgorithm.
  • 명령(Command): 버튼 클릭 시 실행될 LoadImageCommand, ApplyAlgorithmCommand.

RelayCommand : 버튼과 함수를 연결

코드를 작성하기 전에, MVVM에서 버튼 클릭 이벤트를 어떻게 처리하는지 이해해야 합니다. 예전에는 버튼을 더블 클릭해서 Button_Click 함수를 만들었지만, MVVM에서는 Command 방식을 사용합니다.

하지만 우리가 만든 일반 함수(LoadImage)는 WPF 버튼이 알아듣는 ICommand 규격이 아닙니다. 그래서 일반 함수를 ICommand처럼 보이게 포장해주는 상자가 필요한데, 그것이 바로 RelayCommand 클래스입니다.

이 클래스는 View와 ViewModel을 깔끔하게 분리해 주는 MVVM의 필수 요소입니다.

MainViewModel.cs

이제 MainViewModel.cs 파일에 아래 코드를 작성합니다. RelayCommand 클래스도 파일 하단에 함께 포함되어 있습니다.

코드 핵심 분석

비동기(Async) UI 처리

LoadImageApplyAlgorithm 함수를 보면 async void로 선언되어 있습니다. 이는 대용량 이미지를 처리할 때 화면이 멈추는(Freezing) 현상을 막기 위함입니다. 작업이 진행되는 동안 IsBusy 속성을 true로 만들어 로딩 바를 띄우는 센스도 추가되었습니다.

알고리즘 파라미터 자동 생성

SelectedAlgorithm 속성의 set 부분을 보면, 콤보박스에서 알고리즘을 선택하는 순간 CreateParametersForAlgorithm이 호출됩니다. 즉, 사용자가 선택한 알고리즘에 맞는 설정 값 객체(Model)가 즉시 준비되는 구조입니다.

RelayCommand의 동작 흐름

마지막으로 버튼이 눌렸을 때의 동작 과정을 정리해 보겠습니다.

  1. 연결: XAML View에서 <Button Command="{Binding LoadImageCommand}" ... />로 바인딩합니다.
  2. 클릭: 사용자가 버튼을 클릭합니다.
  3. 실행: 버튼은 RelayCommand.Execute()를 호출합니다.
  4. 전달: RelayCommand는 미리 저장해둔 LoadImage() 함수를 대신 실행해 줍니다.

이런 구조 덕분에 디자인(View)과 로직(ViewModel)이 서로를 몰라도 완벽하게 작동하는 느슨한 결합(Loose Coupling)이 완성됩니다.

🚀 다음 단계

이제 ModelViewModel이 모두 준비되었습니다! 다음 시간에는 드디어 이 모든 것을 화면에 보여줄 View(XAML)를 디자인하고 완성해 보겠습니다

댓글 남기기