WPF DataGrid не показывает все строки - PullRequest
1 голос
/ 12 февраля 2011

У меня есть ObservableCollection, привязанная к WPF DataGrid. ObservableCollection заполняется и обновляется асинхронно.

DataGrid не отображает правильное количество строк. Каждый раз, когда я запускаю приложение, отображаются строки с различным числом, обычно 7-8, а иногда только одна. Я получаю тот же беваир с ListBox, но не с ComboBox.

Я получаю такое же поведение с ListBox и ItemsControl, но не с ComboBox. ComboBox правильно отображает все 18 элементов, как и ожидалось.

EDIT

Этот тип CollectionView не поддерживает изменения в его SourceCollection из потока, отличного от потока Dispatcher.

Мне нужно проделать дополнительную детективную работу, так как я предполагаю, что обновления происходили в одной и той же ветке. Таким образом, причина того, что первые несколько элементов отображаются правильно, заключается в том, что ViewModel смог получить некоторые данные до того, как само представление загрузилось.

Ответы [ 2 ]

1 голос
/ 12 февраля 2011

Я могу подтвердить, что это действительно проблема с многопоточностью. Я идиот для того, чтобы сбрасывать исключения при добавлении в коллекцию, потому что я, вероятно, обнаружил бы ошибку раньше! Никогда не делай этого! Это плохая практика.

Возможные решения этой проблемы рассматриваются здесь:

ObservableCollection and threading

0 голосов
/ 12 февраля 2011

Используйте этот код:
(обратите внимание, что 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...