2011-02-12 3 views
0

J'ai une ObservableCollection liée à un DataGrid WPF. Le ObservableCollection est rempli et mis à jour de manière asynchrone.WPF DataGrid ne pas afficher toutes les lignes

Le contrôle DataGrid n'affiche pas le nombre correct de lignes. Chaque fois que je lance l'application, j'obtiens un nombre variable de rangées affichées, généralement 7-8 mais parfois seulement un. Je reçois le même behvaior avec ListBox, mais pas avec ComboBox.

Je reçois le même comportement avec un contrôle ListBox et ItemsControl mais pas avec ComboBox. Le ComboBox affiche correctement tous les 18 éléments comme prévu.

EDIT

Ce type de CollectionView ne supporte pas les changements à son SourceCollection d'un fil différent du fil Dispatcher.

Je vais devoir faire un peu plus de travail de détective ici car ma présomption était que les mises à jour se passaient dans le même fil. La raison pour laquelle les premiers éléments s'affichent correctement est que ViewModel a pu récupérer certaines données avant que la vue ne soit chargée.

+0

Peut-être que le problème est dans la fonction enrichissez et mise à jour de manière asynchrone Le ObservableCollection. – Tony

+0

Juste pour un test: Essayez de lier la collection à un simple ListBox pour voir si le problème persiste. – Tony

+1

Ne changez pas la référence à la collection; effacez-le et ajoutez les éléments dans –

Répondre

0

Je peux confirmer que cela est en effet un problème de filetage. Je suis un idiot pour avoir jeté les exceptions en ajoutant à la collection, parce que j'aurais probablement repéré l'erreur plus tôt! Ne fais jamais ça! C'est une mauvaise pratique.

solutions possibles à ce problème sont abordés ici:

ObservableCollection and threading

0

Utilisez ce code:
(Notez que DownloadedItem et ESt propriétés doivent également être en utilisant INotifyPropertyChanged comme dans cet exemple)

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 
} 
+0

Ceci est très similaire à ce que j'ai en place seulement J'ai la chaîne pour le nom de la propriété codée en dur au lieu d'utiliser la réflexion. Je reçois correctement toutes les notifications comme prévu dans mon ViewModel, donc je ne pense pas que ce soit un problème à ce niveau. La liste est liée à l'assemblage, il semble donc que le problème se situe entre ObservableColletion et list ou grid. – Brian

Questions connexes