ICollectionView 또는 ObservableCollection에 바인딩해야합니까?


83

해야 하나 바인드 DataGrid받는

ICollectionView = CollectionViewSource.GetDefaultView(collection)

또는

ObservableCollection<T> collection; ???

MVVM의 모범 사례는 무엇이며 그 이유는 무엇입니까?

답변:


129

당신은 항상 에 바인딩 ICollectionView당신이 명시 여부를 확인 여부.

우리가 가지고 있다고 가정

var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);

이 경우 collection또는에 바인딩 collectionView은 하나이며 동일합니다. 바인딩 엔진은에 바인딩하도록 지시하면 기본 컬렉션 뷰 (와 동일한 참조 collectionView)에 바인딩됩니다 collection.

이것은 귀하의 질문에 대한 대답은 "그것은 전혀 차이가 없습니다"라는 것을 의미합니다.

완전히 명확하게 말하자면, 컬렉션에 직접 바인딩하더라도 바인딩 엔진은 기본 뷰에 바인딩됩니다. 정렬 기준과 같은보기의 속성을 수정하면 컬렉션에 직접 바인딩하는 것처럼 보이는 바인딩에 영향을줍니다. 커버 뒤에는 대신 기본보기에 대한 바인딩이 있기 때문입니다.

그러나 또 다른 흥미롭고 관련된 질문이 있습니다. 하나는 기본 컬렉션 뷰 (즉, 기본 뷰에 명시 적으로 바인딩 할 이유가 없기 때문에 컬렉션 자체에 바인딩해야 함) 또는 동일한 컬렉션의 다른 뷰에 바인딩해야합니까?

각보기에 현재 항목, 정렬 기준 등의 고유 한 개념이 있다는 점을 고려할 때 동일한 컬렉션에 대한 여러 바인딩이 있고 바인딩 된 컨트롤에 현재 항목, 필터 및 회사의 고유 한 개념이 있어야하는 경우 다음과 같습니다. 원하는 것은 동일한 기본 컬렉션의 여러 뷰에 명시 적으로 바인딩하는 것입니다.


1
멋진 대답입니다. 내가 선호하는 것은 이제 ObservableCollection이 System.Collections의 일부이고 View와는 대조적으로 내가 모델에 대해 표현하는 것을 "느끼는"더 많이 "느낌"을주는 것입니다.하지만 MVVM은 때때로 이런 식으로 감각적입니다.
Berryl 2011 년

훌륭한 대답. Silverlight에서는 바인딩 된 컬렉션이 ICollectionViewFactory를 구현하지 않는 한 바인딩 된 컬렉션에 대해 기본 CollectionView가 생성되지 않는다는 점을 지적하고 싶습니다.
jspaey

유니버설 앱에도 적용 되나요?
Robert MacLean 2014

@RobertMacLean : WP 개발 경험이 없어서 안타깝게도 전혀 모릅니다.
Jon

xaml에서 기본 컬렉션에 대한 명시 적보기를 만들려면 Resources. CollectionViewSource.Source 속성을 기본 컬렉션에 연결합니다. 그런 다음 StaticResource를 통해 리소스에서 만든 CollectionViewSource에 ItemsControl.ItemSource 속성을 바인딩합니다. 이렇게하면 하나의 뷰에 적용된 정렬 / 필터 / 그룹화 작업이 기본 CollectionView에 바인딩 된 다른 ItemsControl을 "오염"시키지 않습니다.
Frank Liu

35

ObservableCollection<T>INotifyCollectionChanged컬렉션의 항목이 변경되면 UI에이를 구현 하고 알립니다.

ICollectionViewINotifyCollectionChanged기본 컬렉션이이를 구현하는 경우 이벤트 를 전파하는 것 외에도 컬렉션을 필터링, 정렬 또는 그룹화하는 기능을 제공 합니다.

두 유형 모두 MVVM에 바인딩하는 한 잘 작동합니다. ICollectionView정렬, 필터링 또는 그룹화가 필요할 때 사용 합니다. ObservableCollection<T>그렇지 않은 경우 직접 사용하십시오 .


이 다른 게시물은 ICollectionView가 컬렉션 변경 이벤트를 기반으로 자동으로 업데이트된다는 것과 모순되는 것 같습니다. 정확하지 않습니까? stackoverflow.com/a/17906474/3195477
UuDdLrLrSs

@UuDdLrLrSs 컬렉션의 항목이 수정되면 해당 항목에 바인딩 된 UI 또는 해당 항목의 속성이 컬렉션에 대해 Refresh를 호출 할 필요없이 업데이트됩니다. 다른 게시물은 컬렉션에있는 항목의 속성 변경에 대해 구체적으로 묻고 필터 기준과 여전히 일치하는 항목 만 포함하도록 ICollectionView의 새로 고침을 자동으로 트리거합니다. 다른 게시물의 답변에 따라 컬렉션의 항목 "목록"을 업데이트하려면 Refresh () 메서드를 호출해야합니다.
Jimmie R. Houts

9

Jon이 말한 것에 추가하십시오. 주된 차이점 CollectionViewSource.GetDefaultView(collection)은를 사용 하면 ViewModel이 WPF에 종속 된다는 것 입니다. 많은 MVVM 순수 주의자들은 이것을 좋아하지 않으며 이것은 ObservableCollection에만 유효한 옵션을 남겨 둘 것입니다.

다른 옵션은이를 ICollectionView구현하지만 WPF 자체의 일부가 아닌 클래스 를 사용 하고 사용하는 것입니다.


1
그러나 그것은 주요 차이점이 아닙니다. wpf 태그에 유의하십시오. "[만약] 바인딩 된 컨트롤이 현재 항목, 필터 및 회사에 대한 고유 한 개념을 가져야하는 경우 원하는 것은 동일한 기본 컬렉션의 여러보기에 명시 적으로 바인딩하는 것입니다." 그것이 차이입니다. "순수 주의자"라는 것은 무엇이든 필터링 할 수 없다는 것을 의미합니다.보다 명확한 언어의 실제 차이에 초점을 맞춘 Jimmie Houts 답변을 참조하십시오.
Dirk Bester 2014

7

나는 그것이 MVVM그 자체로 아무것도 할 필요가 없다고 생각 합니다. ICollectionView소링 그룹화 등과 같은 추가 기능을 제공 IColectionView합니다.ObservableCollection


2

그리드가보기에 적용된 설정 (예 : 필터링)을 표시하도록하려면보기에 바인딩합니다. 그렇지 않으면보기가 중복됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.