-
데이터 바인딩 (3).NetFramWork/WPF 2022. 6. 27. 20:35
Clear 버튼을 이용한 TextBox 컨트롤 지우기
결과에서 볼 수 있듯 Clear 버튼을 클릭하면 데이터 원본 객체인 per 의 Name 과 Phone 의 모든 텍스트가 지워지지만 UI 에 변경이 적용되지 않는다.
이것은 per.Name 이나 per.Phone 속성은 일반 .Net 속성이므로 속성의 변경(데이터 원본의 변경) 사실을 UI 에 동기화하지 못한다.
private void eraseButton_Click(object sender, RoutedEventArgs e)
{
per.Name = ""; per.Phone = "";
}
이 코드에서 per 의 속성을 변경하지만 이 속성과 바인딩되어 있는 UI 는 변경되지 않는다.
데이터 원본(원본 객체의 속성)의 변경을 UI 에 통보하기 위한 바인딩을 사용하려면 몇 가지 약속된 절차를 구현해야 한다.
Clear 버튼으로 데이터 원본을 변경하고 UI에 동기화 하기
이제 Clear 를 클릭하면 원본 객체의 변경이 UI 에 동기화 된다.
이처럼 동작하기 위해서는 데이터 원본 객체의 속성(Name, Phone)은 속성이 set(변경)될 때 변경 사실을 INotifyPropertyChanged 인터페이스를 통해 알려야 한다.
INotifyPropertyChanged 는 하나의 이벤트 public event PropertyChangedEventHandler PropertyChanged 를 멤버로 가지고 있는 인터페이스로 set 프로퍼티에서 호출하도록 약속되어 있다.
다음과 같이
public string Name
{
get { return name; }
set
{
name = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
PropertyChanged 는 첫 인수로 데이터 원본 객체로
두 번째 인수로 PropertyChangedEventArgs(“Name”)으로 이벤트를 발생시킨다.
이때 “Name”은 데이터 원본에 참여하는 속성의 이름이다.
이제 다음 코드는
private void eraseButton_Click(object sender, RoutedEventArgs e)
{
per.Name = "";
per.Phone = "";
}
바인딩된 UI 를 변경한다.
데이터 아일랜드라고 부르는 각 요소에 표현할 수 있는 리소스를 사용하면 데이터 원본을 C# 코드에서 설정하지 않고 XAML 코드에서 설정하고 사용할 수 있다.
(WPF 의 리소스는 기존 리소스 개념보다 조금 확장된 개념으로 명명될 수 있는 데이터를 일반적으로 리소스라고 하며 기존의 사용되었던 리소스도 모두 리소스라고 한다.)
리소스는 이제 x:Key 값 “person”을 사용하여 XAML 이나 C#에서 사용할 수있다.
이제 바인딩 원본을 설정하기 위해 C# 코드를 사용하지 않고,
다음과 같이 XAML 코드에서 바로 설정하여 사용했으며 Clear 버튼이 클릭되었을 시 person 객체를 변경하기 위해
per = (Person)FindResource("person");
처럼 리소스의 키값으로 “person” 객체를 찾는 FindResource() 메소드를 이용하여 XAML 상의 객체의 참조를 찾고
per.Name = "";
per.Phone = "";
처럼 변경한다.
데이터 원본을 명시적으로 바인딩 문법을 사용하여 설정할 수 있으며 이때는 부모 요소의 DataContext 에 설정된 데이터 원본보다 우선한다.
'.NetFramWork > WPF' 카테고리의 다른 글
데이터 바인딩 (4) (0) 2022.06.28 데이터 바인딩 (2) (0) 2022.06.27 데이터 바인딩(1) (0) 2022.06.27 버블링 과 터널링 (라우트된 이벤트) (0) 2022.06.24 레이아웃 <Grid> (0) 2022.06.23