WPF DataGrid未显示所有行

时间:2011-02-12 01:23:29

标签: c# wpf multithreading datagrid binding

我有一个绑定到WPF DataGrid的ObservableCollection。 ObservableCollection以异步方式填充和更新。

DataGrid未显示正确的行数。每次运行应用程序时,我都会显示不同的行数,通常为7-8,但有时只有一行。我使用ListBox获得相同的behvaior,但不使用ComboBox。

我使用ListBox和ItemsControl获得了相同的行为,但没有使用ComboBox。 ComboBox按预期正确显示所有18个项目。

修改

这种类型的CollectionView不支持从与Dispatcher线程不同的线程更改其SourceCollection。

我需要在这里做更多的侦探工作,因为我的推测是更新发生在同一个线程中。因此,正确显示前几个项目的原因是ViewModel能够在View自身加载之前检索一些数据。

2 个答案:

答案 0 :(得分:1)

我可以确认这确实是一个线程问题。在添加到集合时,我是一个倾倒异常的白痴,因为我可能会更早发现错误!永远不要这样做!这是一个糟糕的实践。

这里解决了这个问题的可能解决方案:

ObservableCollection and threading

答案 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
}