Skip to main content

ITK MVVM 아키텍처 기본 흐름

이 문서는 ITK의 MVVM-First 구조를 코드 중심으로 설명합니다. 핵심은 "ViewModel에서 설계하고, View는 매핑된다"는 점입니다.

1) ViewModelBase 기반 상태 관리

ITK ViewModel은 ViewModelBaseSetProperty를 통해 변경 통지와 바인딩 동기화를 일관되게 처리합니다.

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)에서 처리