|
|
2. List를 사용하는 곳과 ObservableCollection을 사용 용도
그러나, 추가/삭제가 되는 목록이라도, 추가/삭제 후 다시 조회(재조회)를 통해서 처리하는 것이 더 편하다면, List를 사용해도 문제 없습니다. 단, 조회할 데이터의 양이 많다면, 문제가 좀 있을 수는 있겠죠?
3. ObservableCollection을 사용할 때 주의사항
private 필드에 초기값으로 new ObservableCollection<T>를 사용하기 때문에, 뷰모델 내부에서 null로 초기화를 하거나, ToList()를 이용해서 List를 넣지 않고, Clear() 후 Add 혹은 Insert를 이용해서 추가를 하는 것이 좋습니다.
4. List와 ObservableCollection의 비교를 하기 위한 셈플 애플리케이션
MainWindow.xaml
왼쪽은 List 데이터를 바인딩하는 DataGrid이고, 오른쪽은 ObservableCollection 데이터를 바인딩하는 DataGrid입니다.
MainViewModel.cs
기본적인 내용을 가지는 메인뷰모델을 생성합니다.
여기서 주의 깊게 보셔야 하는 부분은 아래 내용입니다.
2개의 프로퍼티는 모두 IList<Person>으로 접근하도록 구성되어 있으며, _rightPeople만 new ObservableCollection<Person>();이 붙어 있는데, 2개로 구성된 프로퍼티(private과 public)의 경우에는 private 필드에 초기값을 주는 것이 일반적인 형태입니다. 프로퍼티에 초기값을 주는 것은 권장됩니다.
List<Person>이나 ObservableCollection<Person>이나 둘다 IList 인터페이스를 상속 받기 때문에 선언 및 사용에 문제가 없습니다. 다만, 프로퍼티를 생성할 때에는 정확한 타입명으로 선언을하면, 그 프로퍼티에 넣을 수 있는 값이 한정됩니다. 즉, List형 프로퍼티는 List만 넣을 수 있고, ObservableCollection형 프로퍼티는 ObservableCollection만 넣을 수 있게 됩니다. 처음에는 잘 모르지만, 나중에 사용하면 할수록 불편함을 느끼게 될 것입니다.(특히, ObservableCollection) 그래서, 저는 사용하기 편한 최소 단위 인터페이스를 이용해서 프로퍼티를 생성합니다. 어차피 뷰모델에서는 Add, Remove 등을 IList에 있는 메소드와 기능만 이용해서 데이터 추가/삭제만 하고, CollectixxonChanged 이벤트를 사용할 일이 별로 없기 때문입니다.
혹시 CollectixxonChanged 이벤트를 뷰모델 내부에 이벤트 핸들러를 추가해서 사용해야하는 경우라면, 그렇게 사용하셔도 무관하기는 합니다.
가장 작은 목록형 데이터의 타입은 IEnumerable이지만, LINQ를 사용할 수 없기 때문에 잘 사용하지 않습니다.
최종 소스는 part2 하단에 링크를 추가하도록 하겠습니다.
5. 실행 화면
왼쪽 DataGrid위에 List'1이라고 출력되는 것은 바인딩된 프로퍼티의 타입명입니다.
오른쪽에 DataGrid위에 ObservableCollection'1은 바인딩된 프로퍼티의 타입명입니다.
각 버튼에 코딩을 진행해야 하는데, 전체 내용이 좀 길어지기 때문에, part2에서 계속 진행하도록 하겠습니다.

6. 전체 소스는 part2에서 공개하도록 하겠습니다.
|
|