ITK MVVM 아키텍처 기본 흐름
이 문서는 ITK의 MVVM-First 구조를 코드 중심으로 설명합니다. 핵심은 "ViewModel에서 설계하고, View는 매핑된다"는 점입니다.
1) ViewModelBase 기반 상태 관리
ITK ViewModel은 ViewModelBase의 SetProperty를 통해 변경 통지와 바인딩 동기화를 일관되게 처리합니다.
public class LineStatusVm : ViewModelBase
{
private double _temperature;
private bool _isAlarm;
public double Temperature
{
get => _temperature;
set => SetProperty(ref _temperature, value);
}
public bool IsAlarm
{
get => _isAlarm;
set => SetProperty(ref _isAlarm, value);
}
}
2) WindowVm에서 화면 조합
WindowVm은 화면 루트로 동작하며 하위 ViewModel을 조합합니다.
public class MainWindowVm : WindowVm
{
private readonly LineStatusVm _lineStatus;
private readonly CommandVm _acknowledgeAlarm;
public LineStatusVm LineStatus => _lineStatus;
public CommandVm AcknowledgeAlarm => _acknowledgeAlarm;
public MainWindowVm(LineStatusVm lineStatus)
{
_lineStatus = lineStatus;
_acknowledgeAlarm = new CommandVm("AcknowledgeAlarm")
{
Label = "localized://CommonString/Action_Acknowledge",
Command = new RelayCommand(_ => ExecuteAcknowledge(), _ => _lineStatus.IsAlarm)
};
}
private void ExecuteAcknowledge()
{
_lineStatus.IsAlarm = false;
}
}
3) ViewLocator로 Vm -> View 매핑
플랫폼별 라이브러리에서 View를 등록하면, 런타임에 ViewModel 타입 기반으로 View가 선택됩니다.
public sealed class ItkWpfLibrary : ItkWpfLibraryBase
{
protected override void RegisterView()
{
ViewLocator.Register<MainWindowVm, WindowView>();
ViewLocator.Register<LineStatusVm, DigitalIndicatorMetricView>("Main");
ViewLocator.Register<CommandVm, ButtonView>();
}
}
4) 플랫폼 교체 시 ViewModel 재사용
ViewModel은 공통 계층에 유지하고, 플랫폼별 View만 교체합니다.
<!-- WPF -->
<itk:ViewPresenter Content="{Binding LineStatus}" Slot="Main" />
<!-- Avalonia -->
<itk:ViewPresenter Content="{Binding LineStatus}" Slot="Main" />
같은 ViewModel을 사용하므로 비즈니스 로직은 유지되고, View 레이어 중심으로 마이그레이션할 수 있습니다.
5) 적용 포인트 요약
- 상태/명령은
ViewModelBase,CommandVm계층에서 먼저 설계 - 화면 루트는
WindowVm에서 조합 - View 연결은
ViewLocator등록으로 해결 - 플랫폼 확장은 View 어댑터 계층(
XamlDS.Itk.Wpf/XamlDS.Itk.Aui)에서 처리