2010-07-05 1 views
0

Imaginez les suivantes:WPF - Recharger une collection (avec 'nouveau') sans contrôle reconsolidation

class Repository 
{ 
    private ObservableCollection<ModelClass> _allEntries; 
    public ObservableCollection<ModelClass> AllEntries 
    { 
     get { return _allEntries; } 
     set { _allEntries = value; } 
    } 
    public void RefreshDataFromDB() 
    { 
     _all = new ObservableCollection(GetMyData()); // whatever method there is 
    } 
} 

Maintenant il y a quelques contrôles qui se lient à cette collection, par exemple:

<ListView ItemsSource="{Binding Repository.AllEntries, ElementName=Whatever}"/> 

Le problème est maintenant que si j'appelle le RefreshDataFromDB les liaisons se perdent (du moins il semble) que le _all pointe maintenant vers la nouvelle partie de la mémoire et les liaisons utilisent toujours l'ancienne référence. INotifyPropertyChanged ne m'aide pas dans ce cas (par exemple, le mettre RefreshDataFromDB n'aide pas beaucoup). La question serait - comment géreriez-vous un cas où vous répondez à une collection et souhaitez mettre à jour les liaisons de ses clients?

+0

Je pense e S'il y a une faute de frappe, votre nom de propriété est AllEntries alors que vous êtes lié à TOUS! – akjoshi

+0

Que voulez-vous dire exactement par: "les fixations se perdent (au moins il semble)" Pouvez-vous s'il vous plaît fournir plus de détails. – akjoshi

+0

La question avait une solution simple, mais juste pour clarifier: 1. Oui, c'est une faute de frappe là-bas. Ce devrait être AllEntries. 2. Les liaisons sont perdues et sont initialement liées à la variable _all => une référence mémoire. Lorsque j'utilise le mot clé 'new', la référence _all change et pointe vers une autre adresse en mémoire, mais les contrôles qui se lient à _all regardent toujours l'ancienne mémoire. Fondamentalement, le problème était de savoir comment éviter les contrôles en utilisant l'ancienne adresse. C'est tout. La solution simple de Kieren (.Clear() + .AddRange()) a aidé mon cas. – Jefim

Répondre

1

Oui; vous ne modifiez pas la collection, l'interface utilisateur est liée à la collection, puis vous la remplacez par une nouvelle.

Vous pouvez le faire:

_all.Clear(); 
_all.AddRange(GetMyData()); 

Hope that helps!


Sinon, make AllEntries (ou All .. votre nomenclature semble changer plusieurs fois sur le poteau;)) DependencyProperty:

public static DependencyProperty AllEntriesProperty = DependencyProperty.Register("AllEntries", typeof(ObservableCollection), typeof(MyClass)); 

Vous auriez besoin de faire le get/set bien aussi, voir ici pour un exemple:

http://msdn.microsoft.com/en-us/library/ms752914.aspx

+0

Vous n'avez pas forcément besoin d'une implémentation 'DependencyProperty' -' INotifyPropertyChanged' sur la propriété. –

+0

Merci, ça m'a beaucoup aidé. Je n'ai pas pensé à effacer la même instance en premier lieu :) – Jefim

Questions connexes