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.
C'est tout! Je vous remercie! – devuxer