Mvvm Sample for Winforms
์ด์ฒ ์ฐ
2022๋ 11์์ ์ถ์ํ ๋ง์ดํฌ๋ก์ํ็คพ์ .Net 7 ์์ Winforms ํ๋ก์ ํธ๊ฐ MVVM ํจํด์ ์ง์ํ๋๋ก ๋ช ๊ฐ์ง ๋ณํ๊ฐ ์์๋ค.[์ฐธ๊ณ 1]
- ButtonBase ํด๋์ค์ Command ์์ฑ ์ถ๊ฐ
- ToolStripItem ํด๋์ค์ Command ์์ฑ ์ถ๊ฐ
- Control ํด๋์ค์ DataContext ์์ฑ ์ถ๊ฐ
์๋ ๊ทธ๋ฆผ์ Winforms ๋์์ธ ๋ชจ๋์์ Command๋ฅผ ๋ฌถ๋ ๊ฒ์ ๋ณด์ฌ์ค๋ค.[์ฐธ๊ณ 2]
(๊ทธ๋ฆผ1)
์ด ๊ธ์์๋ ๊ธ์ฐ์ด์ ๋จผ์ ๊ธ - MVVM Sample for Wpf[์ฐธ๊ณ 3] - ์ ๊ธฐ์ด๋ก, .Net 8 Winforms ํ๋ก์ ํธ์์ MVVM ํจํด์ ๊ตฌํํ๋ค. ํ๋ก์ ํธ A๋ฅผ ๋ง๋ค๊ณ CommunityToolkit.Mvvm 8.3.2๋ฅผ ์ฐธ์กฐ๋ก ๋ฃ๋๋ค.
[์ฐธ๊ณ 3]์ Model.cs์ ViewModel.cs๋ฅผ ํ๋ก์ ํธ A์ ๋ฃ๋๋ค.
ํ๋ก์ ํธ A๋ฅผ ๋ง๋ค ๋ ์์ฑ๋ Form1.cs๋ฅผ ๋ค์์ฒ๋ผ ๋ฐ๊พผ๋ค. ์ด ๊ธ์์๋ ๋ฌถ์(Binding) ๊ธฐ๋ฅ์ ์ฝ๋๋ก ๊ตฌํํ๋ค.
// Form1.cs
public partial class Form1 : Form
{
private readonly ViewModel _viewModel;
private readonly Panel _mainPanel;
private readonly Panel _dataPanel;
private readonly Panel _actionPanel;
private readonly TextBox _textBoxData;
private readonly Button _buttonReset;
private readonly Button _buttonIncrease;
public Form1()
{
InitializeComponent();
_viewModel = new ViewModel(new Model());
DataContext = _viewModel;
_mainPanel = new Panel();
_dataPanel = new Panel();
_actionPanel = new Panel();
_textBoxData = new TextBox();
_buttonReset = new Button();
_buttonIncrease = new Button();
InitComponents();
}
private void InitComponents()
{
_mainPanel.SuspendLayout();
SuspendLayout();
var label = new Label
{
Text = "Data",
Dock = DockStyle.Left
};
_textBoxData.Dock = DockStyle.Fill;
_textBoxData.TextAlign = HorizontalAlignment.Right;
_textBoxData.DataBindings.Add(new Binding("Text", DataContext, "Model.Data"));
_dataPanel.Controls.Add(_textBoxData);
_dataPanel.Controls.Add(label);
_buttonReset.AutoSize = true;
_buttonReset.Dock = DockStyle.Left;
_buttonReset.Text = "Reset";
_buttonReset.Command = _viewModel.ResetCommand;
_buttonIncrease.AutoSize = true;
_buttonIncrease.Dock = DockStyle.Left;
_buttonIncrease.Text = "Increase";
_buttonIncrease.Command = _viewModel.IncreaseCommand;
_actionPanel.Controls.Add(_buttonReset);
_actionPanel.Controls.Add(_buttonIncrease);
_dataPanel.Height = 36;
_dataPanel.Dock = DockStyle.Top;
_actionPanel.Height = 36;
_actionPanel.Dock = DockStyle.Top;
_mainPanel.Controls.Add(_actionPanel);
_mainPanel.Controls.Add(_dataPanel);
Controls.Add(_mainPanel);
_mainPanel.Dock = DockStyle.Fill;
_mainPanel.ResumeLayout(false);
_mainPanel.PerformLayout();
ResumeLayout(false);
}
}
(์ฝ๋ 1)
ํ๋ก์ ํธ A๋ฅผ ๋น๋ํ๊ณ ์คํํ๋ค.
์ด์ Winforms์์๋ ๋น์ง๋์ค ๋ก์ง๊ณผ UI๋ฅผ WPF์ฒ๋ผ ๋ถ๋ฆฌํ ์ ์๋ค. Winforms์์ ์๋ก ๋ํ ์ฌ๋ฌ Control๋ค๊ณผ ํจ๊ป, ์ด ๋ถ๋ฆฌ๋ฅผ ์ฝ๋๋ก ๊ตฌํํ๋ฉด ๋ง์ ์ด์ ์ด ์์ ๊ฒ์ผ๋ก ์๊ฐํ๋ค. ํ ์๋ก Winforms ๋์์ธ ๋ชจ๋์์ UI ์์ฑ์ ๋ฐ๊พธ๋ ๊ฒ์ '์ฌํ์ฉโ์ ๋ถ๋ฆฌํ๋ฐ, ์ด ๋ฌธ์ ๋ฅผ ์์จ ์ ์๋ค.
[์ฐธ๊ณ 1]
Windows Forms Binding Improvements in .NET 7 for MVVM Support