2011-03-02 2 views
0

저는 WP7 dev에 익숙하지 않습니다. 데이터 바인딩을 사용하려고합니다. xml 파일이 있고 그것을 목록 상자에서 나타내고 싶습니다. 나는 내가 Listbox에 넣으려는 결과 인 Linq 쿼리를 만드는 ModelView를 만들었습니다. 나는 DataBinding의 많은 예제가 ObservableCollection 클래스를 사용하는 것을 보아왔다 ... Linq를 사용하여 행 단위로 루핑하는 대신 결과를 얻고 싶지만 ObservableCollection 대신 IEnumerable을 사용하면 DataBinding이 작동하지 않는다. 그게 정상인가요?WP7 : ObservableCollection 대신 ViewModel에서 IEnumerable을 사용할 수 있습니까?

미리 감사드립니다. c.

답변

1

Silverlight는 데이터 바인딩을 업데이트하기 위해 속성이 변경 될 때 알림을 받기 위해 속성 변경 메커니즘에서 작동합니다. 뷰 모델 클래스에서 종속성 속성을 사용하거나 (보기 모델에서는 거의 발생하지 않을 수도 있음) INotifyPropertyChanged 인터페이스를 구현할 수 있습니다.

ObservableCollection의 경우 콘텐츠 변경 (추가/제거/삽입)시 실제로 CollectionChanged 이벤트가 발생하고 데이터 바인딩을 업데이트하라는 메시지가 표시됩니다. 귀하의 경우에는 IEnumerable에 Y 인드하여 데이터 바인딩 메커니즘은 이벤트가 제기되지 않아 내용이 변경된시기를 알 수 없습니다.

모든 작업의 ​​결과가 새 목록 인 경우 다시 쿼리 할 때마다 ObservableCollection을 생성하여 아무 것도 얻지 못합니다. 따라서 다시 쿼리 할 때 implement the INotifyPropertyChanged interface이 필요하고 yrou IEnumerable 속성 변경 알림을 발생시켜야합니다.

당신은 추가/다음 ObservableCollection를 처음 만든 다음 잘 작동합니다 각 쿼리에 Add/Remove를 호출하면 다시 쿼리를 때마다 제거하는 항목이있는 경우.

0

작동하려면 IList이어야합니다. IEnumerable이 작동하지 않습니다.

LINQ 쿼리에 .ToList()을 추가하여 List<T>으로 변환 해보십시오.

ObservableCollection<T>은 해당 컬렉션의 항목을 변경하여 UI이 자동으로 새로 고쳐 지도록하려는 경우 사용해야합니다.

0

OC의 생성자 중 하나에 전달하여 열거 형에서 ObservableCollection을 만들 수 있습니다. 물론 Cast LINQ result to ObservableCollection

ObservableCollection<Foo> x = new ObservableCollection<Foo>(enumerable); 

씨, 당신은 기록을 통해 자신을 반복하지 않으려 인해 코드의 행동에 이유가없는 경우이에만 적용됩니다.

0

하지만 ObservableCollection에 대신 IEnumerable을 사용하는 경우, 데이터 바인딩은에 ItemsSource 속성에 대한 사실, 데이터 항목의 목록에 대한 IEnumerable는 문제가되지 않습니다 정의를 사용

작동하지 않습니다 ListBox은 다음과 같습니다

public IEnumerable ItemsSource { get; set; } 

는 대부분의 경우 문제가 그 값합니다 (INotifyPropertyChanged 인터페이스를 사용) 변경되면 재산이 통지되지 않는 것입니다.

ObservableCollection 유형은 INotifyCollectionChanged을 구현하는 모음이므로 컬렉션 항목 자체의 속성이 변경되었을 때 사용자에게 알리지는 않지만 컬렉션 자체가 언제 변경되었는지 쉽게 알 수 있습니다. 또한 INotifyPropertyChanged를 구현합니다. 이는 ViewModel의 속성에서 데이터 바인딩이 작동하는 이유 일 가능성이 큽니다. 이 경우에 ObservableCollection을 사용하는 것이 좋은 이유는 컬렉션에 항목을 추가 및 제거하여 목록 기반 컨트롤을 업데이트 할 수 있기 때문입니다. 목록을 다시 바인딩하거나 목록을 다시 작성할 필요가 없기 때문입니다.

IEnumerable<> 속성에 바인딩하는 경우 속성이 변경되었다는 알림을 표시하고 개별 항목 추가/제거가 UI에 자동으로 반영되지 않는다는 것을 알아야합니다. 바운드 프로퍼티가 변경되었습니다 (약간의 해킹이 될 수 있습니다).

관련 문제