2011-02-12 8 views
0

ObservableCollection을 WPF DataGrid에 바인딩했습니다. ObservableCollection은 채워지고 비동기 적으로 업데이트됩니다.WPF DataGrid가 모든 행을 표시하지 않습니다.

DataGrid에 올바른 행 수가 표시되지 않습니다. 응용 프로그램을 실행할 때마다 다양한 숫자 행이 표시됩니다. 일반적으로 7-8이지만 때로는 하나만 표시됩니다. ListBox에서는 동일한 behvaior를 얻지 만 ComboBox에서는 그렇지 않습니다.

이 동작은 ListBox 및 ItemsControl에서는 발생하지만 ComboBox에서는 발생하지 않습니다. ComboBox 올바르게 18 개의 항목을 모두 표시합니다.

편집

디스패처 스레드에서 다른 스레드에서의 SourceCollection 변경을 지원하지 않습니다 CollectionView의이 유형.

내 생각에는 동일한 스레드에서 업데이트가 발생 했으므로 여기서 좀 더 탐정 작업을해야합니다. 첫 번째 항목이 올바르게 표시되는 이유는 View 자체가로드되기 전에 ViewModel이 일부 데이터를 검색 할 수 있었기 때문입니다.

+0

은 어쩌면 문제는 채우고 비동기 ObservableCollection에 업데이트하는 기능입니다. – Tony

+0

테스트 용 : 단순한 ListBox에 컬렉션을 바인딩하여 문제가 지속되는지 확인합니다. – Tony

+1

컬렉션에 대한 참조를 변경하지 마십시오. 그것을 지우고 항목을 추가하십시오. –

답변

0

을 (DownloadedItem 및 속성이 예에서와 같이에서 INotifyPropertyChanged를 사용하고 있어야합니다 키우면 알 수 있습니다). 나는 컬렉션에 추가 할 때 예외를 버리는 바보입니다. 아마 오류를 더 빨리 발견했기 때문입니다! 이것을 절대하지 마십시오! 그것은 나쁜 pratice입니다. 이 문제에 대한

가능한 솔루션을 다룹니다 :

ObservableCollection and threading

0

사용이 코드 :
내가이 참으로 스레딩 문제가 있음을 확인할 수 있습니다

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Collections.ObjectModel; 

namespace WpfApplication1 
{ 
    class Downloads : NotifyBase 
    { 
     public virtual ObservableCollection<DownloadedItem> DownloadedItemCollection 
     { 
      get { return _DownloadedItemCollection; } 
      set { _DownloadedItemCollection = value; OnPropertyChanged(System.Reflection.MethodBase.GetCurrentMethod().Name.Substring(4)); /*OnPropertyChanged("DownloadedItemCollection");*/ } 
     } private ObservableCollection<DownloadedItem> _DownloadedItemCollection; 

    } 
} 

public class NotifyBase : INotifyPropertyChanged 
{ 
    #region NotifyBase 
    // Declare the event 
    public virtual event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(String propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 
} 
+0

이것은 리플렉션을 사용하는 대신 하드 코딩 된 속성 이름의 문자열 만 가지고있는 것과 매우 비슷합니다. ViewModel에서 예상대로 모든 알림을 받고 있으므로이 수준에서 문제가 있다고 생각하지 않습니다. 목록은 colletion에 바인딩되어 있으므로 ObservableColletion과 목록 또는 그리드 사이에 문제가있는 것처럼 보입니다. – Brian

관련 문제