๐Ÿ˜Š์˜ˆ์ „์— ๋งŒ๋“  MVVM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๊ฐœ์„ ํ•ด๋ณด์ž.

๊ฐœ๋ฐœ ๋‹น์‹œ์—๋Š” chatGPT๋ฅผ ์“ฐ์ง€๋„ ์•Š๊ณ  ๊ฐœ๋ฐœ์„ ํ–ˆ๋Š”๋ฐ.
๋ช‡ ๋…„ ์ง€๋‚˜์„œ ๋ณด๋‹ˆ ์ •๋ง ์ฝ”๋“œ๊ฐ€ ๋ถ€๋„๋Ÿฝ๊ตฐ์š”.
์ด๋ฒˆ์—๋Š” ๊ทธ๋ƒฅ ๋งˆ์Œ์„ ๋‚ด๋ ค๋†“๊ณ  chatGPT์™€ ๋Œ€ํ™”๋ฅผ ํ•˜๋ฉด์„œ ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ๊ฐœ์„ ์„ ํ•ด๋ณด๊ณ  ์‹ถ์–ด์กŒ์Šต๋‹ˆ๋‹ค.
๊ฐ€๋” ๊ท€์ฐฎ๊ฒŒ ์—ฐ๋ฝ ๋“œ๋ฆฌ๋ฉด์„œ @์ด๊ด‘์„ @jamesnet214 ์ข‹์€ ๋ง์”€ ๋“ฃ๊ณ  ์žˆ๋Š”๋ฐ ๋ฐฐ์›€์—๋Š” ๋์ด ์—†๊ตฐ์š”.

7๊ฐœ์˜ ์ข‹์•„์š”

์•ˆ๊ท€์ฐฎ์•„์š”..์žฌ๋ฐŒ์–ด์š”

5๊ฐœ์˜ ์ข‹์•„์š”

chatGPT์™€ ์งˆ๋ฌธํ•˜๋ฉด์„œ ๋ฐฐ์šด์ .

๋ฌผ์–ด๋ณด๋ฉด์„œ ๋‹ค์‹œ ํ•˜๋‚˜ํ•˜๋‚˜ chatgpt๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ๋“ค์„ ๋ณด๊ณ  ์ด์ „์— ๋ชฐ๋ž๋˜ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. 
(-_-) ๋ญ”๊ฐ€ AI์—๊ฒŒ ํŒจ๋ฐฐํ•œ ๊ธฐ๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

1. ViewModelBase vs ObservableObject

Prism์—์„œ๋Š” ViewModelBase๋กœ ๋ถ€๋ฅด๋Š”๋ฐ CommunityToolkit์—์„œ ObservableObject๋กœ ๋ถ€๋ฅด๋Š” ์ด์œ ๋„ ์žˆ๋”๊ตฐ์š”. ์‹ค๋ฌด์—์„œ๋Š” ๊ฐ„ํ˜น ๋ชจ๋ธ์— ViewModelBase๋ฅผ ์ƒ์†๋ฐ›๋Š”๋ฐ ๊ทธ๋Ÿผ ViewModel์ฒ˜๋Ÿผ ๋ณด์ด๋‹ˆ๊นŒ CommunityToolkit์—์„œ๋Š” ObservableObject ํ˜น์€ ObservableRecipient๋กœ ๋ถ€๋ฅด๋”๊ตฐ์š”.
๊ทธ ์˜๋„๊ฐ€ ์ข‹์€ ๊ฒƒ ๊ฐ™์•„์„œ ComvMVVM2์— ์žˆ๋˜ ViewModelBase์ด๋ฆ„์„ ๋‹ค์‹œ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

2. CommunityToolkit์˜ IoC ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ จ ๊ธฐ๋Šฅ

์˜ˆ์ „์— ์†์œผ๋กœ ๋‚ด ๋งˆ์Œ๋Œ€๋กœ ioc ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌํ˜„ ํ•  ์ ์—๋Š” ๋‚ด๊ฐ€ ์ž์ฃผ ์“ฐ๋Š” ๊ธฐ๋Šฅ๋งŒ์„ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ.
๋‚ด๊ฐ€ ๋ชฐ๋ž๋˜ ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

1. ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค ๋ฌถ์Œ์˜ ๊ฐ์ฒด๋“ค์„ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ.


var vms = serviceProvider.GetServices<IAInterface>();

์˜ˆ์ „ ๊ตฌํ˜„์—์„œ๋Š” IAInterface์™€ ๊ตฌ์ƒ์ฒด๋ฅผ 1๊ฐœ๋งŒ ๋งค์นญํ•ด์„œ ๋„ฃ๊ฒŒ ๋งŒ๋“ค์—ˆ์—ˆ๋Š”๋ฐ CommunityToolkit์€ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋“ฑ๋ก ํ•  ์ˆ˜ ์žˆ๋‚˜๋ด…๋‹ˆ๋‹ค. ใ… 

2. Factory๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ActivatorUtilities ์กด์žฌ

์ด ๋…€์„์€.. CommunityToolkit์— ์—†๋Š” ๋…€์„์ธ ๊ฒƒ ๊ฐ™์€๋ฐ ์–ด๋””์„œ ํŠ€์–ด๋‚˜์™€์„œ chatGPT๊ฐ€ ์•Œ๊ณ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ. ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ ๋˜๊ฒŒ ์ผ๋ฆฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ œ๊ฐ€ WPF ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœ ํ•  ๋•Œ์—๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์„ ์œ„ํ•œ Factory๋ฅผ Lambda๋กœ ์ •์˜ํ•ด์„œ ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž… ๋ฐ›๊ณ  ์‚ฌ์šฉํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

// ๋Œ€์ถฉ ์ด๋Ÿฐ ๋А๋‚Œ 
serviceCollection.AddTransient<AViewModel>();
serviceCollection.AddTransient<Func<AViewModel>>((serviceProvider) =>{
    return () => serviceProvider.GetService<AViewModel>();
})

//๋งŒ์•ฝ Factory์— ์ธ์ž๋ฅผ ์ฃผ์ž…ํ•˜๋ฉด์„œ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด
serviceCollection.AddTransient<BViewModel>();
serviceCollection.AddTransient<Func<int, int, AViewModel>((serviceProvider) => {
   return (a, b) => {
         var vm = serviceProvider.GetService<BViewModel>();
         vm.A = a;
         vm.B = b;
         return vm;
   }
});

ํ•˜์ง€๋งŒ.. ActivatorUtilities ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‚ด๊ฐ€ ํž˜๋“ค๊ฒŒ Factory๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ฃผ์ž… ํ•  ํ•„์š” ์—†์ด Factory๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋”๊ตฐ์š” ๊ฐ“ MS
๊ทธ๋ฆฌ๊ณ  serviceProvider.GetService(); ๊ฐ€ ๋˜๋„๋ก return this ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์–ด์„œ
๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž ์ฃผ์ž…์œผ๋กœ IServiceProvider๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์ด๋ฒˆ์— ์ด์•ผ๊ธฐํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์ €๋ ‡๊ฒŒ IServiceProvider๋ฅผ ์ฃผ์ž… ๋ฐ›์•„์„œ ์“ฐ๋ฉด ๋ญ”๊ฐ€ ์ง€์ €๋ถ„ ํ•ด ์งˆ ๊ฒƒ ๊ฐ™์€๋ฐ. ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋งŽ์ด ๋งŒ๋“ค๋•Œ์—๋Š” ์กฐ๊ฑด๋ถ€๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

3. ๋ฉ”์‹ ์ € ๊ด€๋ จ ๊ธฐ๋Šฅ

1. IWeakReferenceMessenger์˜ Token๊ธฐ๋Šฅ.

๋ชจ๋ฅด๋ฉด ๋ชธ์ด ๊ณ ์ƒํ•œ๋‹ค๊ณ .. ํ† ํฐ์„ ์„ค์ •ํ•ด์„œ ํŠน์ • ํ† ํฐ์œผ๋กœ๋งŒ ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋”๊ตฐ์š” ์„ธ์ƒ์—๋‚˜.. ์ด๊ฑธ ๋ชฐ๋ผ์„œ ๋งค๋ฒˆ ๋ฉ”์„ธ์ง€์— ๋ณด๋‚ผ ๊ณณ ์ ๊ณ  ๋ฐ›๋Š” ์ชฝ์—์„œ switch์ฒ˜๋ฆฌํ–ˆ๋Š”๋ฐ ์ฉ..

2. ObservableRecipient์˜ IsActive=True ๋™์ž‘.

IsActive๊ฐ€ True์ผ๋•Œ ObservableRecipient๊ฐ€ ์ƒ์† ๋ฐ›์€ IRecipient์˜ ๋ฉ”์„ธ์ง€ํ•ธ๋“ค๋Ÿฌ?๊ฐ€ ์ž๋™์œผ๋กœ ๋“ฑ๋ก์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฒˆ์— ์ฒ˜์Œ ์•Œ์•˜์Šต๋‹ˆ๋‹ค -_-โ€ฆ ์ด์ „์—๋Š” OnActivation์ด์—ˆ๋˜๊ฐ€ ๊ฑฐ๊ธฐ์„œ ๋“ฑ๋ก์„ ํ–ˆ์—ˆ๋Š”๋ฐ ๋ถˆํ•„์š”ํ•œ ์‚ฝ์งˆ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ IsActive=False์ผ๋•Œ์—๋Š” ๋ชจ๋“  ๋ฉ”์„ธ์ง€ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋“ฑ๋ก์ด ํ•ด์ œ๋˜๋Š” ๊ฒƒ ๊ฐ™๋”๊ตฐ์š”. ์ƒ์†๋ฐ›๊ณ  ๋ฉ”์„ธ์ง€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•œ ํ›„์— IsActive๋งŒ ํ‚ค๋ฉด ์ž๋™๋“ฑ๋ก ๊ธฐ์–ตํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค. ใ… 

4. Prism๊ด€๋ จ ๊ธฐ๋Šฅ

1. INavigationService์˜ ๋™์ž‘

๋‚˜๋ฆ„๋Œ€๋กœ ์ƒ๊ฐํ•ด์„œ ๋งŒ๋“ค์—ˆ์—ˆ๋Š”๋ฐ ๋‹ค ์—‰ํ„ฐ๋ฆฌ์˜€์Šต๋‹ˆ๋‹ค.
ํ•„ํžˆ routeํ‚ค?๋ฅผ ์ด์šฉํ•œ ํ™”๋ฉด ์ด๋™? ๊ธฐ๋Šฅ์ด ๋“ค์–ด๊ฐ€์•ผ ์ง„์ •ํ•œ INavigationService๊ฐ€ ์•„๋‹๊ฐ€ ์‹ถ๋„ค์š”.
route๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€๋„ chatGPT์„ ์ƒ๋‹˜์—๊ฒŒ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

2. Region์ด ์™œ ItemsControl๊ฐ™์€ ๋…€์„๋“ค์—๊ฒŒ๋„ ๋ถ™๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ๋Š”๊ฐ€?

Region์„ ์ด์šฉํ•ด์„œ ํ™”๋ฉด์„ ๋ถ™์ด๋Š” ๊ฑด ์ด์ „์— ๋‚ฉ๋“์ด ๊ฐ€์„œ ๊ตฌํ˜„์„ ํ–ˆ์—ˆ๋Š”๋ฐ ItemsControl๊ฐ™์€ ๋ฆฌ์ŠคํŠธํ˜•ํƒœ์˜ ๋…€์„์—๋„ Region์„ ๋ถ™์ด๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ ๊ตฌํ˜„์„ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทผ๋ฐ chatGPT ์„ ์ƒ๋‹˜์ด ๋ง์”€ํ•˜์‹œ๋Š” ๋ถ€๋ถ„์—์„œ ํฐ ๊นจ๋‹ซ์Œ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.
๋งŒ์•ฝ ItemsControl์— Region์ด ๋ถ™์ง€ ์•Š๋Š”๋‹ค๋ฉด ItemsControl์„ ์†Œ์œ ํ•œ View์˜ ViewModel์—์„œ ItemsControl์— ๋ฟŒ๋ ค์•ผ ํ•  ๊ฐ์ฒด ๋ฌถ์Œ์„ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— View์™€ ViewModel์ด ๋Š˜์–ด๋‚  ์ˆ˜๋ก ์ผ๊ด€๋œ ๊ด€๋ฆฌ๊ฐ€ ํž˜๋“ค์–ด์ง„๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
Region์ด ์—†๋‹ค๋ฉด ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ViewModel๊ณผ ํ™”๋ฉด๋ผ๋ฆฌ์˜ ๋ฌถ์Œ ๋ฐ์ดํ„ฐ ๊ตํ™˜๊ณผ ์‹œ๊ฐํ™” ๊ณผ์ •์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด ์ง€๊ธฐ ๋•Œ๋ฌธ์— ItemsControl์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” View์˜ ViewModel์ด ๋ณต์žกํ•ด์ง„๋‹ค๋Š” ๊ฑฐ์ง€์š”.

3. Module์˜ On-Demand ๋กœ๋“œ

Assembly๋Š” ๋กœ๋“œํ•œ ์ƒํƒœ๋กœ Module์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” View๋‚˜ ViewModel, ์„œ๋น„์Šค๋“ฑ์˜ ์ƒ์„ฑ์ด ํ•„์š”ํ• ๋•Œ ๋ชจ๋“ˆ์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค ใ…  ์ด ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘์ด ๋นจ๋ผ์ ธ์„œ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ์ด๋ฒˆ์— ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

์–ด์ œ @gellston ๋‹˜์ด๋ž‘ ์–˜๊ธฐํ•˜๋‹ค๊ฐ€
โ€œItemsControl์— ์™œ ๊ตณ์ด Region์„ ์ผ์„๊นŒ?โ€๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ดค์Šต๋‹ˆ๋‹ค.
์ €๋„ ํ•œ๋™์•ˆ ๋”ฑ ์ž˜๋ผ ์„ค๋ช…ํ•˜๊ธฐ๋Š” ์• ๋งคํ–ˆ๋Š”๋ฐ, ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ด๋Ÿฐ ์ด์œ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ItemsControl์„ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์“ฐ๋‹ค ๋ณด๋ฉด
๊ฒฐ๊ตญ DataTemplate๋กœ ViewModel ํƒ€์ž…๋งˆ๋‹ค ํ™”๋ฉด์„ ๋‚˜๋ˆ„๊ฒŒ ๋˜๋Š”๋ฐ,
1~2๊ฐœ๋ฉด ๋ชฐ๋ผ๋„ ํ™”๋ฉด์ด ๋Š˜์–ด๋‚˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด
์ž์นซ XAML์ด ๋์—†์ด ๋Š˜์–ด๋‚˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ํ™”๋ฉด์ด ํ™•์žฅ๋˜๋ฉด์„œ ๊ธฐ๋Šฅ์ด ๋ถ™๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด,
ํŠน์ • ํƒ€์ž…์ผ ๋•Œ๋งŒ ๋™์ž‘ํ•˜๋Š” ๋กœ์ง์ด๋‚˜
์—ฐ๊ฒฐํ•ด์•ผ ํ•  ์„œ๋น„์Šค๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์•„์ง€๊ณ ,
์ด๋Ÿฐ ์š”์†Œ๋“ค์ด ์Œ“์ด๋ฉด์„œ
๋‹จ์ˆœํžˆ DataTemplate ์•ˆ์—์„œ ํ•ด๊ฒฐํ•˜๊ธฐ์—”
UI ํ˜•ํƒœ๋‚˜ ๋ณต์žก๋„๊ฐ€ ๊ฐ๋‹นํ•˜๊ธฐ ์–ด๋ ค์šด ์ˆ˜์ค€๊นŒ์ง€ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Region์„ ์“ฐ๋Š” ์ชฝ์€ ์ด๊ฑธ ๊ตฌ์กฐ์ ์œผ๋กœ ๋Š์„ ์ˆ˜ ์žˆ๊ณ ์š”.
๊ฐ View๋Š” ํ•„์š”ํ•  ๋•Œ Region์— ๋“ค์–ด์˜ค๊ณ ,
ItemsControl ์ชฝ ViewModel์€
โ€œ๋ญ˜ ๊ทธ๋ฆด์ง€โ€๋ณด๋‹ค๋Š” โ€œ์ž๋ฆฌ๋ฅผ ๋‚ด์ฃผ๋Š” ์—ญํ• โ€์— ๊ฐ€๊นŒ์›Œ์ง‘๋‹ˆ๋‹ค.


ItemsControl์˜ Region๋ฟ๋งŒ ์•„๋‹ˆ๋ผ,
Region ๊ตฌ์กฐ ์ž์ฒด๊ฐ€
MVVM์„ ์•„์ฃผ ์—„๊ฒฉํ•˜๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š” ๋ฐฉ์‹๋ณด๋‹ค๋Š”,
Viewโ€“ViewModel์„ ํ•œ ์Œ์œผ๋กœ ๋ฌถ์–ด
์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๋Š” ๋ฐ ์ž˜ ๋งž๋Š” ์„ ํƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”