데이터 바인딩
차의 운전석에 앉아, 차를 운전할 때, 만약 핸들을 돌린 방향과 차량이 반대 방향으로 움직인다면 어떻게 될까? 위험하고 혼란스러울 것이다. 이처럼, 행동과 그 결과가 일관되게 반응하는 것이 중요한데
이와 비슷하게, 사용자 인터페이스(UI)를 다룰 때 우리는 UI 요소와 데이터 간의 일관성을 유지하려고 노력한다. 여기서 C#의 DataBindings 속성이 활용되는데, 이것은 UI 컴포넌트와 데이터 소스를 "연결"해주는 역할을 한다.
< 데이터 바인딩이란 무엇인가? >
"데이터 바인딩(Data Binding)"이란 이름에서 알 수 있듯이, 데이터와 어떤 요소를 '연결'하는 것이다. 사용자 인터페이스 요소 (예: 텍스트 박스)와 데이터 소스(예: 객체의 속성) 간에 '연결고리'를 만들어준다. 이로 인해 데이터가 변경될 때 UI가 자동으로 업데이트되고, 반대로 UI에서 사용자가 변경을 가하면 데이터 소스에도 반영된다.
왜 데이터 바인딩을 사용할까?
[일관성 유지]
데이터 바인딩의 가장 큰 장점 중 하나는 UI와 데이터 사이의 일관성을 유지할 수 있다는 것이다. 예를 들어, 데이터의 값이 변경되면 UI에 해당 변경이 자동으로 반영되어 사용자가 최신 상태를 보게 된다.
[코드 양 감소]
데이터 바인딩을 사용하면 UI 업데이트를 위한 코드를 수동으로 작성할 필요가 없어진다. 데이터의 변경을 감지하고 UI를 적절하게 업데이트하는 것을 프레임워크가 알아서 처리해준다.
[유지보수 용이]
데이터 바인딩은 모델과 뷰 간의 강력한 결합을 준다. 따라서 코드의 유지보수가 더 쉬워지고, 각 부분을 독립적으로 테스트하거나 변경하는 것이 용이해진다.
언제 데이터 바인딩을 사용하는가?
UI에서 표시하는 데이터가 자주 변경되거나, 사용자의 입력을 통해 데이터가 변경되는 경우 데이터 바인딩을 사용하면 매우 효율적이다. 또한, 복잡한 사용자 인터페이스를 가지고 있고 그 인터페이스가 다양한 데이터 소스와 상호작용하는 경우에도 유용하다.
textBoxCity.DataBindings.Add("Text", address, nameof(City));
여기서 textBoxCity는 사용자가 도시 이름을 입력할 수 있는 텍스트 박스다. address는 주소 정보를 담고 있는 객체이고, City는 그 중 도시 이름을 나타내는 속성이다.
이 코드를 통해 텍스트 박스의 'Text' 속성과 address 객체의 'City' 속성이 연결된다. 이제 사용자가 텍스트 박스에 도시 이름을 입력하면 address 객체의 'City' 속성이 자동으로 업데이트된다. 반대로, address 객체의 'City' 속성이 프로그램에 의해 변경되면 그 변경 사항이 텍스트 박스에 자동으로 반영된다.
Address.cs를 아래와 같이 만들고
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApp2
{
public class Address : INotifyPropertyChanged
{
private string city;
public event PropertyChangedEventHandler PropertyChanged;
public string City
{
get { return city; }
set
{
if (city != value)
{
city = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(City)));
}
}
}
}
}
아래와 같이 Form1 코드를 작성한다 여기서 TextBox는 도구 툴에서 만들어도 된다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
private Address address;
// textBoxCity를 선언
private TextBox textBoxCity = new TextBox();
public Form1()
{
InitializeComponent();
// Address 객체를 생성하고 초기 도시를 '서울'로 설정
address = new Address() { City = "서울" };
// textBoxCity의 Text 속성을 address 객체의 City 속성에 바인딩
textBoxCity.DataBindings.Add("Text", address, nameof(Address.City), false, DataSourceUpdateMode.OnPropertyChanged);
// textBoxCity를 폼에 추가 가능 .
this.Controls.Add(textBoxCity);
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}