我有一个绑定到WPF ObservableCollection的DataGrid。ObservableCollection是异步填充和更新的。
DataGrid没有显示正确的行数。每次运行应用程序时,都会显示不同数量的行,通常为7-8行,但有时只有一行。我在ListBox上得到了同样的好处,但ComboBox却没有。
我在ListBox和ItemsControl中得到了同样的行为,但ComboBox却没有。ComboBox按预期正确显示所有18项。
编辑
这种类型的CollectionView不支持与Dispatcher线程不同的线程对其SourceCollection的更改。
我需要在这里做更多的调查工作,因为我的假设是更新是在同一个线程中发生的。因此,正确显示前几项的原因是,ViewModel能够在加载视图之前检索一些数据。
发布于 2011-02-12 19:08:35
我可以证实这确实是一个线程问题。我是个白痴,当添加到集合中时,我会抛出异常,因为我可能会更早发现错误!千万别这么做!这是不好的做法。
解决这一问题的可能办法如下:
发布于 2011-02-12 01:38:45
使用以下代码:
(注意,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
}https://stackoverflow.com/questions/4975689
复制相似问题