我有一个绑定到WPF DataGrid的ObservableCollection。 ObservableCollection以异步方式填充和更新。
DataGrid未显示正确的行数。每次运行应用程序时,我都会显示不同的行数,通常为7-8,但有时只有一行。我使用ListBox获得相同的behvaior,但不使用ComboBox。
我使用ListBox和ItemsControl获得了相同的行为,但没有使用ComboBox。 ComboBox按预期正确显示所有18个项目。
修改
这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection。
我需要在这里做更多的侦探工作,因为我的推测是更新发生在同一个线程中。因此,正确显示前几个项目的原因是ViewModel能够在View自身加载之前检索一些数据。
答案 0 :(得分:1)
我可以确认这确实是一个线程问题。在添加到集合时,我是一个倾倒异常的白痴,因为我可能会更早发现错误!永远不要这样做!这是一个糟糕的实践。
这里解决了这个问题的可能解决方案:
答案 1 :(得分:0)
使用此代码:
(请注意,DownloadedItem及其属性也必须使用INotifyPropertyChanged,如本例所示)
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
}