해야 하나 바인드 DataGrid
받는
ICollectionView = CollectionViewSource.GetDefaultView(collection)
또는
ObservableCollection<T> collection;
???
MVVM의 모범 사례는 무엇이며 그 이유는 무엇입니까?
해야 하나 바인드 DataGrid
받는
ICollectionView = CollectionViewSource.GetDefaultView(collection)
또는
ObservableCollection<T> collection;
???
MVVM의 모범 사례는 무엇이며 그 이유는 무엇입니까?
답변:
당신은 항상 에 바인딩 ICollectionView
당신이 명시 여부를 확인 여부.
우리가 가지고 있다고 가정
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
이 경우 collection
또는에 바인딩 collectionView
은 하나이며 동일합니다. 바인딩 엔진은에 바인딩하도록 지시하면 기본 컬렉션 뷰 (와 동일한 참조 collectionView
)에 바인딩됩니다 collection
.
이것은 귀하의 질문에 대한 대답은 "그것은 전혀 차이가 없습니다"라는 것을 의미합니다.
완전히 명확하게 말하자면, 컬렉션에 직접 바인딩하더라도 바인딩 엔진은 기본 뷰에 바인딩됩니다. 정렬 기준과 같은보기의 속성을 수정하면 컬렉션에 직접 바인딩하는 것처럼 보이는 바인딩에 영향을줍니다. 커버 뒤에는 대신 기본보기에 대한 바인딩이 있기 때문입니다.
그러나 또 다른 흥미롭고 관련된 질문이 있습니다. 하나는 기본 컬렉션 뷰 (즉, 기본 뷰에 명시 적으로 바인딩 할 이유가 없기 때문에 컬렉션 자체에 바인딩해야 함) 또는 동일한 컬렉션의 다른 뷰에 바인딩해야합니까?
각보기에 현재 항목, 정렬 기준 등의 고유 한 개념이 있다는 점을 고려할 때 동일한 컬렉션에 대한 여러 바인딩이 있고 바인딩 된 컨트롤에 현재 항목, 필터 및 회사의 고유 한 개념이 있어야하는 경우 다음과 같습니다. 원하는 것은 동일한 기본 컬렉션의 여러 뷰에 명시 적으로 바인딩하는 것입니다.
ObservableCollection<T>
INotifyCollectionChanged
컬렉션의 항목이 변경되면 UI에이를 구현 하고 알립니다.
ICollectionView
INotifyCollectionChanged
기본 컬렉션이이를 구현하는 경우 이벤트 를 전파하는 것 외에도 컬렉션을 필터링, 정렬 또는 그룹화하는 기능을 제공 합니다.
두 유형 모두 MVVM에 바인딩하는 한 잘 작동합니다. ICollectionView
정렬, 필터링 또는 그룹화가 필요할 때 사용 합니다. ObservableCollection<T>
그렇지 않은 경우 직접 사용하십시오 .
Jon이 말한 것에 추가하십시오. 주된 차이점 CollectionViewSource.GetDefaultView(collection)
은를 사용 하면 ViewModel이 WPF에 종속 된다는 것 입니다. 많은 MVVM 순수 주의자들은 이것을 좋아하지 않으며 이것은 ObservableCollection에만 유효한 옵션을 남겨 둘 것입니다.
다른 옵션은이를 ICollectionView
구현하지만 WPF 자체의 일부가 아닌 클래스 를 사용 하고 사용하는 것입니다.
그리드가보기에 적용된 설정 (예 : 필터링)을 표시하도록하려면보기에 바인딩합니다. 그렇지 않으면보기가 중복됩니다.