MVVM ์ WPF์ ํจ๊ป ์๊ฐ๋๊ธฐ๋ ํ์ง๋ง, WPF์ ํ์ ๋ ๊ฒ์ ์๋๋๋ค.
์ํผ์๋ ์ ์ฉํ ์ ์์ผ๋ฉฐ, ํ๋ค ๋ชปํด ์ฝ์์ฑ์๋ ์ ์ฉํ ์ ์์ต๋๋ค.
์ง๋ฌธ์ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช
์ ๋๋ฆฌ๋ฉด,
์ฒซ์งธ๋ก ๊ทธ๋ฌํ ๋ชจ์์ผ๋ก ๋ณด์ด๋๋ก ํ๋ ๊ฒ์ View์ ์ญํ ์
๋๋ค.
์ฐ์ธก์ ๋ค๋ชจ๋ ์์๊ฐ ๋ฒํผ์ด๋ผ๋ฉด, ๋ฒํผ ๋ชจ์์ผ๋ก ๋ณด์ด๊ฒ ํ๋ ๊ฒ๋, ๋ฒํผ ์ฒ๋ผ ํ๋ํ๋ ๊ฒ - ํด๋ฆญํ๋ฉด ๋๋ ค์ง๋ ์ก์
์ ํ๋ ๊ฒ๋ ๋ทฐ์ ์ญํ ์
๋๋ค.
๋์งธ๋ก, ๋ฒํผ์ด ์ฐ์ธก์์ ์ข์ธก์ผ๋ก ๋์ด๊ฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋๋ ๊ฒ๋ View ์ ์ผ์
๋๋ค.
๊ทธ๋ฐ๋ฐ, ๊ทธ ๋๊น์ ์๋ฏธ๊ฐ, ๋ก์ง์ ์๋ฏธ - ์๋ฅผ ๋ค๋ฉด, ์ถ๊ฐ๋ ์ญ์ ํ ํญ๋ชฉ์ ํํํ๋ ๊ฒ์ด๋ผ๋ฉด, ๊ทธ ํญ๋ชฉ์ ๊ด๋ฆฌ๋ ViewModel ์ ์
๋ฌด์
๋๋ค.
public class ViewModel
{
// ๋ก์ง์ ์ํ ์ํ
public List<Item> Stored {get; set;} = [];
public List<Item> Temp { get set; } = [];
// ๋ก์ง
public void MoveToTemp(string itemName)
{
if (Stored.FirstOrDefault(x => x.Name == itemName) is Item item)
Temp.Add(item);
}
}
// Psuedo View
<LeftSection>
<ItemsGrid/> // _viewModel.Temp ์ ๋ฐ์ธ๋ฉ
</LeftSectoin>
<RightSection>
<ItemsStack/> // _viewModel.Stored ์ ๋ฐ์ธ๋ฉ
</RightSection>
// View Code-behind
private ViewModel _viewModel;
private void OnButtonOnItemStackClicked(object? s, EventArgs e)
{
if (s is Button button)
{
_viewModel.MoveToTemp(button.Text);
}
}
๋ณด์๋ค์ํผ, ๋ทฐ๋ ๋ทฐ๋ชจ๋ธ์ ์ํ๋ฅผ ํ๋ฉด์ ๋ฐ์ํ๊ธฐ๋ง ํ ๋ฟ ์ค์ค๋ก ์ํ๋ฅผ ์ ์ฅํ์ง ์์ต๋๋ค.
๋ํ ๋ทฐ๋ ๋ก์ง์ ๊ตฌํํ์ง ์๊ณ , ๋ทฐ๋ชจ๋ธ์ ์๋ ๋ก์ง์ (์ฝ๋ ๋นํ์ธ๋์์) ํธ์ถํ ๋ฟ์
๋๋ค.
๋ทฐ์ ๋ทฐ๋ชจ๋ธ ์ฌ์ด์ ํต์ ์ ์ฝ๋ ๋นํ์ธ๋(Command)์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ(Query)์ ํตํด ์ด๋ค์ง์ ์ ์ ์์ต๋๋ค.
๋ทฐ๋ชจ๋ธ์ด ์ด๋ ๊ฒ ์ค๊ณ๋์ด ์๋ค๋ฉด, ์ด ๋ทฐ๋ชจ๋ธ์ ์ํผ, ์ฝ์ ๋ฟ๋ง ์๋๋ผ, ์ด๋ค UI ํ๋ ์์ํฌ์๋, ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ์ค๊ณํ๋ฉด ๋ทฐ์ ๋ก์ง์ด ๋ถ๋ฆฌ๋๋ค๊ณ ๋ณด๋ ๊ฒ์ด๋ฉฐ, MVVM์ด ์ถ๊ตฌํ๋ ๋ฐ์
๋๋ค.
MVVM์ด ์ ์ง์ผ์ง๊ณ ์๋ ์ง, ๋ณด๋ค ์๋ฐํ ๋งํ๋ฉด, ๋ก์ง๊ณผ ๋ทฐ๊ฐ ์ ์ ํ๊ฒ ๋ถ๋ฆฌ๋์๋ ์ง ๊ถ๊ธํ๋ค๋ฉด ๋ทฐ๋ ์์ ์๋๊ณ , ๋ก์ง๋ง ๋ณํ์์ผ๋ ์ ์ฒด ์ํํธ์จ์ด์ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋์ง๋ฅผ ํ์ธํ๋ฉด ๋ฉ๋๋ค.
public class ViewModel
{
// ...
// ๋ก์ง ๊ตฌํ์ ์์
public void MoveToTemp(string itemName)
{
if (Stored.FirstOrDefault(x => x.Name == itemName) is Item item
&& Temp.FirstOrDefault(x => x.Name == itemName) is null)
Temp.Add(item);
}
}
WPF๋ MVVM์ ์ง์ํ๋ ์ฌ๋ฌ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ทธ ํจํด์ ๋ฐ๋ฅด๋ฉด ์ํํธ์จ์ด๋ฅผ ์์ฑํ๊ณ ์ ์ง ๋ณด์ํ ๋ ํธ๋ฆฌํ ๊ฒ์ ๋ง์ต๋๋ค.
๊ทธ๋ฌ๋, ๋ฐ๋์ ์๋ฐํ๊ฒ ๋ฐ๋ผ์ผ ํ๋ ๊ฒ์ด ์ง๋ฆฌ์ผ ์๋ ์์ต๋๋ค.
์๋ํ๋ฉด, ๋๋ถ๋ถ์ ๋์์ธ ํจํด์ ๋ฏธ๋์ ์ ์ง๋ณด์๋ผ๋ ์์ต์ ์ํด ์ค๋์ ์๊ฐ๋ฝ ํ์ ์ด์ฌํ ํ ๊ฒ์ ์๊ตฌ๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ ๋งํผ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๊ฐ ๋ง๋ค๋ ์๋ฏธ์
๋๋ค.
์ง๊ธ ๋น์ฅ, ์์์ด ๋ถ์กฑํ๋ค๋ฉด ์ฝ๋ ๋นํ์ธ๋์ ๋ค ๋๋ ค ๋ฃ๋ ์ ํ์ ํ๋๋ผ๋, ์ํํธ์จ์ด๋ฅผ ๋์์ํค๋ ๊ฒ์๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ค์ ๋ก ํด๋ณด์๋ฉด, ์ด๋ค ๊ฒ ๋ถ๋ฆฌ๋์ด์ผ ํ ๋ก์ง์ธ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ ํจ์ฌ ๋ ์ด๋ ต๋ค๊ณ ๋๋ ๊ฒ์
๋๋ค.