2009-09-01 6 views
0

Contexte:Les liaisons WPF ne seront pas mises à jour à moins que je ne recréer la liste entière?

J'ai un List<T> dans mon ViewModel défini comme ...

private List<FooBar> _fooBars; 

public List<FooBar> FooBars 
{ 
    get { return _fooBars; } 
    set 
    { 
     if (value == _fooBars) return; 
     _fooBars = value; 
     OnPropertyChanged("FooBars"); 
    } 
} 

FooBar est défini comme ...

public class FooBar 
{ 
    public string FooBarProperty { get; set; } 
    // more properties here 
} 

Pendant ce temps, j'ai GridView que lie à cette liste.

<ListView 
    ItemsSource="{Binding FooBars}"> 
    <ListView.View> 
     <GridView 
      <GridViewColumn 
       Header="Foo Bar Prop" 
       DisplayMemberBinding={Binding FooBarProperty} /> 
      <!--more columns here--> 
     </GridView> 
    </ListView.View> 
</ListView> 

Je lance mon application et tout cela fonctionne très bien. Mes FooBarProperties se remplissent comme prévu.

Le problème:

En réponse à une action de l'utilisateur. I modifier l'un des FooBar objets dans FooBars, et appelez OnPropertyChanged() pour faire savoir à WPF que je veux mettre à jour les liaisons.

FooBars[2].FooBarProperty = "Some new text here"; 
OnProperChanged("FooBars"); // WPF is not listening to this :(

Un seul problème: cela ne fonctionne pas complètement. Le GridView ne disparaît jamais.

A Solution:

Après beaucoup gratter la tête (et les bruits de table et prestation de serment), je suis venu avec ce remplacement pour ce qui précède:

FooBars[2].FooBarProperty = "Some new text here"; 
FooBars = FooBars.Select(fb => fb).ToList(); // this works but why is it necessary? 

fonctionne comme un charme, mais pourquoi Je dois le faire? REMARQUE: J'ai essayé de passer de List<FooBar> à ObservableCollection<FooBar>, mais cela n'a fait absolument aucune différence.

Mes questions:

Très simplement, pourquoi dois-je besoin de ce code fou que, fondamentalement, copie la liste en elle-même pour obtenir mes fixations pour mettre à jour?

Existe-t-il un meilleur moyen de forcer une mise à jour?

Merci.

EDIT - La solution finale:

Merci à @ la réponse de Botz3000 ci-dessous, je suis passé FooBars retour à ObservableCollection<FooBar>, et je l'ai modifié FooBar il implémente INotifyChanged. Tout fonctionne comme prévu et aucune copie de liste bizarre n'est requise.

Répondre

3

Si vous ne modifiez pas l'objet qui est stocké dans le ObservableCollection lui-même, mais plutôt une propriété de celui-ci, l'événement CollectionChanged ne sera pas déclenché.

Votre FooBarProperty a aussi besoin d'un PropertyChanged("FooBarProperty"). Étant donné que les éléments de la liste se lient à cette propriété, ils auront besoin de notifications pour cela.

+0

C'est tout! Je vous remercie! – devuxer