2010-05-25 6 views
3

IEnumerable <>이 데이터를 지연로드합니다. 콤보 박스의 ItemsSource를 IEnumerable로 설정하고 싶지만, 어쨌든 (게으른 로딩 시점을 제거하는) 모든 데이터를로드하고로드합니다.지연로드 wpf 콤보 상자 항목

Linq-To-SQL에서도 비슷한 이론 인 것처럼 보이고 모든 데이터를로드하므로이 스크립트를 사용해 보았습니다.

쉬운 방법이 있나요?

+0

IEnumerable 클래스에 이벤트를 만듭니다. OnDataChange는 DataSource를 다시 설정합니다. 그것이 귀하의 요구 사항에 부합한다면 – PostMan

답변

1

WPF ComboBox가 ItemsSource에서 항목을 느리게로드하는 것을 지원하지 않는다고 생각합니다. 어쨌든 게으른로드가 필요한 이유는 무엇입니까? 게으른로드를 트리거하는시기는 언제입니까?

+0

큰 목록에서 선택하기위한 것입니다. 나는 자동 콤보보다 더 완벽하다고 생각한다. 저는 텍스트에 바인딩하고, 필터를 적용하고, ItemsSource에 바인딩 된 속성의 첫 번째 x 결과를 반환 할 수 있음을 알고, 좀 더 일반적인 것을 기대했습니다. ListBox가 Bing 이미지 검색과 비슷한 것을 제공하기 위해 비슷한 것을 사용할 수 있다고 생각했습니다. –

2

컨트롤을 IEnumerable에 직접 바인딩하지 마십시오. 대신 ObservableCollection (처음에는 비어 있음)에 바인딩하십시오. 한편, 평소와 같이 IEnumerable에서 게으른 로딩을 수행하십시오 (콤보 상자 또는 기타 드롭 다운으로 트리거 됨). 데이터가로드되는 동안 또는 충분히있을 때 데이터를 가져 와서 해당 ObservableCollection에 항목을 추가하여 comboBox를 채 웁니다.

1

ComboBox의 ItemsSource를 ObservableCollection에 바인딩하십시오.

는 이제 IEnumerable을 게으른로드 데이터는이 번 각 항목이 추가되는 UI를 업데이트 할 것 ObservableCollection에 즉시

foreach(Item i in myIEnumerable) 
{ 
    myObsCol.Add(i); 
} 

에 추가 할 때마다.

1

나는 똑같은 일을하려하고있다. 그러나 내가 조사한 것처럼 표준 바인딩을 combobox (ItemsSource 및 dataItem을 SelectedValue/SelectedItem에 콜렉션)에 사용하려면 자체 컨트롤을 작성해야합니다. Combobox는 Selector에서 상속되며 컬렉션을 ItemsSource 속성에 바인딩하고 SelectedValue/SelectedItem에 바인딩 된 속성 값을 변경하면 Selector는 자체 개인 메서드 인 FindItemWithValue (개체 값)를 호출합니다. 이 메서드는 바운드 컬렉션의 항목을 처음부터 동일한 값을 찾을 때까지 탐색합니다. 물론, 선택한 항목 앞에 모든 항목을로드하는 컬렉션을 만들 것입니다.

1

목록이있는 사용자 지정 클래스를 기꺼이 수행하려는 경우 INotifyPropertyChanged 인터페이스를 사용하여 컬렉션이 수정되었음을 알릴 수 있습니다. 또는 사용 ObservableCollection에로 이미되어 제안했다으로

3

참으로 콤보 상자의 ItemsSource - 바인딩에 IsAsync-속성을 설정하십시오 : 그 아무것도 변경되지 않으면

<ComboBox ItemsSource={Binding YourItemsSourceProperty, IsAsync=True} 
      SelectedItem={Binding YourSelectionProperty} /> 

을 이것 좀 봐 하나 : http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3d343489-90c4-4bdc-8bd9-1046ec9daf76 아마도 IList를 사용해야 할 수도 있습니다.

또는 PriorityBinding을 사용하여 최종 목록이 완전히로드 될 때까지 일부 임시 데이터로 목록을 채울 수 있습니다.