INotifyPropertyChanged 인터페이스는 WPF를 하면서 처음 알게되었는데 MSDN에서 이 인터페이스에 대해서 검색을 해보면 .NET 프레임워크 2.0에서 새로 추가된 인터페이스인 것을 알 수 있다. 이 인터페이스는 그 이름대로 프로퍼티가 변경되었음을 알려주는 역할을 한다. 예제를 보기에 앞서 데이터 바인딩에 대한 간단히 알아보면 데이터 소스와 데이터가 바인딩 되는 대상이 있다. 예를 들어서 DB에 직원 정보로 가져온 데이터를 List<Employee>에 넣어 DataGridView 컨트롤에 바인딩 한다고 생각을 해보자. 여기서의 데이터 소스는 List<Employee>이고 데이터 대상은 DataGridView 컨트롤이다.
다음은 INotifyPropertyChanged 인터페이스를 상속받아서 PropertyChanged를 구현한 예이다.
public class DemoCustomer : INotifyPropertyChanged { public DemoCustomer() { } private string customerName = String.Empty; public string CustomerName { get { return customerName; } set { customerName = value; OnPropertyChanged("CustomerName"); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(String info) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(info)); } } |
다음은 이 인터페이스를 구현해서 사용한 방법을 통해서 알게된 사실이다.
1. List<>를 DataGridView.DataSource 프로퍼티에 바인딩 하였을 경우에 포커스가 있는 로우의 경우에는 PropertyChaged가 null이 아니였다. 하지만 해당 로우에 포커스가 없으면 PropertyChaged가 null이고 화면에서는 변경된 사항을 알수가 없다.
2. 소스를 통해서 대상을 변경을 할 수 없다면 이 인터페이스를 사용하는 의미는 그렇게 없다고 생각이 되며 소스가 변경이 될때마다 데이터 대상에 null를 넣어주고 다시 변경된 데이터 소스를 바인딩해주는 방법을 사용하는 편이 낫다는 생각이 들었다.(List<>의 바인딩 속도는 건수가 많더라도 엄청나게 빠르다)
이번 포스트는 여러가지 테스트와 열심히 검색해봤지만 그닥 성과가 없어 상당히 아쉽다. 왜 2.0에서 INotifyPropertyChanged를 사용할 수 있게 해놓고 이런 제약조건(?)를 두어서 사용하기 힘들게 해놨는지 이해가 되지 않는다.
P.S : 제가 잘못 이해하여 오해(?)하고 있는 부분이 있다면 댓글을 통해서 알려주셨으면 합니다~
// 2009년 8월 6일
msdn 매거진에 아래와 같은 내용이 있습니다.
http://msdn.microsoft.com/ko-kr/magazine/cc794276.aspx
INotifyPropertyChanged 인터페이스를 사용할 경우 알아야 할 점이 있습니다. 이 인터페이스에 필요한 것은 PropertyChanged라는 이벤트뿐인데, 클래스가 이 이벤트를 발생시킨다는 보장이 없습니다. 많은 경우 클래스는 일부 public 속성에 대해 이벤트를 발생시키지만 아닌 경우도 있습니다. 소스 코드에 액세스할 수 없는 경우에는 PropertyChanged 이벤트를 발생시키는 속성과 그렇지 않은 속성을 미리 확인할 수 있는 마땅한 방법이 없습니다. |