【问题标题】:WPF DataGrid not showing all rowsWPF DataGrid 未显示所有行
【发布时间】:2011-02-12 01:23:28
【问题描述】:

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

DataGrid 未显示正确的行数。每次运行应用程序时,我都会显示不同数量的行,通常是 7-8,但有时只有一个。我对 ListBox 有相同的行为,但对 ComboBox 却没有。

我在 ListBox 和 ItemsControl 中得到了同样的行为,但在 ComboBox 中没有。 ComboBox 按预期正确显示所有 18 个项目。

编辑

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

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

【问题讨论】:

  • 可能问题出在异步填充和更新 ObservableCollection 的函数中。
  • 只是为了测试:尝试将集合绑定到一个简单的ListBox,看看问题是否仍然存在。
  • 不要更改对集合的引用;清除它并添加项目
  • ListBox 的行为相同
  • 这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。

标签: c# wpf multithreading datagrid binding


【解决方案1】:

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

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

ObservableCollection and threading

【讨论】:

    【解决方案2】:

    使用此代码:
    (请注意,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
    }
    

    【讨论】:

    • 这与我所拥有的非常相似,只是我将属性名称的字符串硬编码而不是使用反射。我在我的 ViewModel 中正确地获得了所有的通知,所以我认为这在这个级别上不是问题。列表绑定到集合,所以看起来问题出在 ObservableColletion 和列表或网格之间。
    猜你喜欢
    • 2013-06-16
    • 2020-12-15
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多