2010-09-29 11 views
1

Je lie une application DataGrid WPF à une ObservableCollection via le "ItemSource" du DataGrid. Au départ, le DataGrid propose des en-têtes et des valeurs, mais les mises à niveau apportées à ObservableCollection ne sont pas reflétées. (c'est-à-dire quand je reviens par programmation et augmente la valeur "Total") La collection Observable que j'utilise est ci-dessous.WFP DataGrid ItemsSource La liaison à ObservableCollection ne se met pas à jour au-delà du premier paramètre?

Des idées pourquoi & comment obtenir la mise à jour/liaison dynamiquement la grille correctement?

public class SummaryItem 
{ 
    public string ProcessName { get; set; } 
    public long Total { get; set; } 
    public long Average { get; set; } 

    public static SummaryItem ObservableCollectionSearch(ObservableCollection<SummaryItem> oc, string procName) 
    { 
     foreach (var summaryItem in oc) 
     { 
      if (summaryItem.ProcessName == procName) return summaryItem; 
     } 
     return null; 
    } 
} 

EDIT - Ou peut-être une question d'add-on est de savoir si dans ce cas DataGrid est pas le contrôle que je devrais utiliser pour visualiser ce qui est effectivement une table en mémoire? C'est la observableCollection of SummaryItem est effectivement la table en mémoire.

Répondre

7

Si je le vois bien, vous utilisez une ObservableCollection. Si vous ajoutez des éléments à ObservableCollection, ces modifications doivent toujours être reflétées par WPF, mais si vous modifiez les propriétés d'un élément (c'est-à-dire, changez la valeur "Total" d'un SummaryItem), vous ne modifiez pas ObservableCollection mais SummaryItem.

Pour obtenir le comportement souhaité à vos SummaryItems doivent implémenter l'interface INotifyPropertyChanged à « notifier » WPF quand propertys sont changés:

// implement the interface 
public event PropertyChangedEventHandler PropertyChanged; 

// use this for every property 
private long _Total; 
public long Total { 
    get { 
     return _Total; 
    } 
    set { 
     _Total = value; 
     if(PropertyChanged != null) { 
      // notifies wpf about the property change 
      PropertyChanged(this, new PropertyChangedEventArgs("Total")); 
     } 
    } 
} 
1

vous venez de rencontrer le problème classique avec ObservableCollection. Seuls les événements d'ajout d'élément et d'élimination d'élément sont déclenchés pour OC. Cela signifie que si un élément change, vous n'obtiendrez PAS un événement "ItemChanged".

0

ObservableCollection augmenter seul événement lorsque vous ajoutez ou supprimez des éléments, si vous avez besoin de lever événement même si un élément à l'intérieur des modifications de la collection utilise BindingList.

+0

Vous pouvez également créer votre propre classe de collection en héritant de ObservableCollection et écouter l'événement PropertyChanged de tous les éléments inclus dans la collection, puis relancer itemchanged chaque fois qu'un événement est levé à partir de n'importe quel élément. –