XAML ๊ณ์ด(WPF / MAUI / WinUI3 / Avalonia / OpenSilver) ๊ฒฝ๋ View-ViewModel ์๋ ์ฐ๊ฒฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ๋ ์์ํฌ ์๋, ๋น์ ๋ง์ ์ํคํ ์ฒ๋ฅผ ๋ง๋ค์ด๋ณด์ธ์
- View์ ViewModel ์ฐ๊ฒฐ๋ง ๋์์ค
- ๊ฐ๋ณ๊ณ ๋จ์, ํ์ํ ๋งํผ๋ง ์ฌ์ฉ
- ๊ธฐ์กด ํ๋ก์ ํธ์๋ ์ฆ์ ์ถ๊ฐ ๊ฐ๋ฅ
- ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ ๋กญ๊ฒ ์กฐํฉ
| Prism | LazyVoom | |
|---|---|---|
| ๋ฒ์ | Navigation, Modules, EventAggregator ๋ฑ ์ ์ฒด ํ๋ ์์ํฌ | View-ViewModel ์ฐ๊ฒฐ๋ง |
| ํ์ต ๊ณก์ | ๋์ โ ์ ์ฒด ์์คํ ํ์ต ํ์ | ๋ฎ์ โ ํ์ํ ๋ถ๋ถ๋ง ์ฌ์ฉ |
| ์ ์ฐ์ฑ | ์ ํด์ง ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ์ผ ํจ | ์์ ๋กญ๊ฒ ์ํคํ ์ฒ ๊ตฌ์ฑ ๊ฐ๋ฅ |
| ์ ์ฉ | ์ ํ๋ก์ ํธ์ ์ ํฉ | ๊ธฐ์กด/์ ํ๋ก์ ํธ ๋ชจ๋ ์ฝ๊ฒ ์ถ๊ฐ ๊ฐ๋ฅ |
| ํฌ๊ธฐ | ํผ | ์์ (ํต์ฌ ๊ธฐ๋ฅ๋ง) |
LazyVoom์ ํ๋ ์์ํฌ๊ฐ ๋์ง ์๊ณ , ๋น์ ์ด ๋ง๋๋ ์ํคํ ์ฒ์ ํ ์กฐ๊ฐ์ด ๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
AutoWireViewModel๋ก ์๋ ์ฐ๊ฒฐ- ์ปค์คํ ์ปจ๋ฒค์ ์ง์
- ๋ช ์์ ๋งคํ ๊ฐ๋ฅ
- DI/IoC ํตํฉ ๊ฐ๋ฅ
- ์ด๊ฒฝ๋ โ ํต์ฌ ๊ธฐ๋ฅ๋ง
// ViewModel ์ฐ๊ฒฐ ์ค์ Voom.Instance .WithContainerResolver(vmType => Activator.CreateInstance(vmType)) .WithConvention(viewType => Type.GetType(viewType.FullName + "ViewModel")) .WithMapping<SpecialView, SpecialViewModel>();
<!--WPF XAML --> <UserControl voom:ViewModelLocator.AutoWireViewModel="True"> <Label Text="{Binding Title}" /> </ContentPage>
<!--MAUI XAML --> <ContentPage voom:ViewModelLocator.AutoWireViewModel="True"> <Label Text="{Binding Title}" /> </ContentPage>
์๋ฆฌ: ๋ช ์์ ๋งคํ โ ์ปจ๋ฒค์ โ ๊ธฐ๋ณธ ๊ท์น โ DI โ DataContext ์ค์
View์ AutoWireViewModel="True" ์ค์ ์:
๋ช ์์ ๋งคํ? โ โผ ์ปจ๋ฒค์ ์ ์ฉ? โ โผ ๊ธฐ๋ณธ ์ปจ๋ฒค์ ์ ์ฉ? โ โผ DI / Container๋ก ViewModel ์์ฑ โ โผ View์ DataContext ์ค์
์ค๋ช :
- ๋ช ์์ ๋งคํ: WithMapping<> ๋ก ์ง์ ํ ๊ฒฝ์ฐ
- ์ปจ๋ฒค์ ์ ์ฉ: WithConvention() ๋ก ์ปค์คํ ๊ท์น ์ ์ฉ
- ๊ธฐ๋ณธ ์ปจ๋ฒค์ : View โ ViewModel ์ด๋ฆ ๊ท์น ์ ์ฉ
- DI / Container: ์์ฑ์ ์ฃผ์ ์ง์
- DataContext: View์ ViewModel ์ฐ๊ฒฐ ์๋ฃ
MyApp/
โโโ Views/
โ โโโ MainPage.xaml
โโโ ViewModels/
โ โโโ MainPageViewModel.cs
โโโ Models/
โโโ Services/
โ ์ฑ ์์ ์ ํ ๋ฒ๋ง ์ค์ โ ์ปจ๋ฒค์ ์ ์ผ๊ด๋๊ฒ โ ๋ช ์์ ๋งคํ ์ต์ํ โ DI์ ํจ๊ป ์ฌ์ฉ
โ ๋ฐํ์ ์ค ์ค์ ๋ณ๊ฒฝ X โ ์๋ DataContext ์ค์ X โ ์ปจ๋ฒค์ + ๋งคํ ๋์ ์ฌ์ฉ X
Prism์ ViewModelLocator ํจํด์์ ์๊ฐ
Caliburn.Micro์ Convention ์์คํ ์ฐธ๊ณ
"ํ๋ ์์ํฌ ์์ด ์์ ๋กญ๊ฒ" ๋ฅผ ์ํ๋ ๊ฐ๋ฐ์๋ค์ ์ํด
LazyVoom์ ํ๋ ์์ํฌ๊ฐ ๋๋ ค ํ์ง ์์ต๋๋ค. ๋น์ ์ด ๋ง๋๋ ์ํคํ ์ฒ์ ํ ์กฐ๊ฐ์ด ๋๊ณ ์ ํฉ๋๋ค.