2009-12-03 4 views
4

Je tente de lier un dictionnaire à un ListView qui est le modèle d'élément constist d'une grille avec 2 zones de texte. Idéalement, j'aimerais pouvoir modifier à la fois la clé et la valeur du KeyValuePair affiché dans ListView. Est-ce possible?Dictionnaire à ListView Liaison TwoWay - possible?

+0

Oui, mais je ne peux pas trouver un moyen de le faire sans une classe intemedite, comme un ViewModel. Est-il d'une importance primordiale que vous vous liez directement au dictionnaire? – angrifel

+0

C'est préféré. Le dictionnaire est censé contenir les paramètres de mon application et autres. – Maciek

Répondre

2

Ce que vous cherchez est quelque chose comme un ObservableCollection<T> mais pour un dictionnaire. Un peu de recherche sur Google a trouvé ce qui suit de Dr. WPF on building an ObservableDictionary:

Avantages et inconvénients

L'avantage d'utiliser un dictionnaire observable, bien sûr, est que le dictionnaire peut servir de ItemsSource pour un contrôle databound et vous pouvez toujours accéder au dictionnaire en code de la même manière que vous accédez à n'importe quel autre dictionnaire. C'est vraiment un dictionnaire indexé d'objets. Il y a certainement certaines limites inhérentes à l'idée même de rendre un dictionnaire observable. Les dictionnaires sont construits pour la vitesse. Lorsque vous importez les comportements d'une collection observable sur un dictionnaire afin que l'infrastructure puisse s'y lier, vous ajoutez un surcoût.

De même, un dictionnaire expose ses collections Values et Keys via des propriétés distinctes du même nom. Ces collections sont des types Dictionary<TKey, TValue>.ValueCollection et Dictionary<TKey, TValue>.KeyCollection, respectivement. Ces collections définies par CLR ne sont pas observables. En tant que tel, vous ne pouvez pas vous lier directement à la collection Values ​​ou à la collection Keys et vous attendre à recevoir des notifications de changement de collection dynamique. Vous devez à la place vous lier directement au dictionnaire observable.

Maintenant, vous pouvez rencontrer un problème avec la mise à jour de la clé, que vous devrez alors convaincre en quelque sorte le dictionnaire Déplacer votre article. Je suggère de prendre le ObservableDictionary de Dr. WPF et en utilisant plutôt un KeyedCollection comme magasin de support. De cette façon, la clé est dérivée de l'élément lui-même, et les mises à jour déplacent l'objet dans le ObservableDictionary automatiquement.

+0

J'ai déjà vu ObservableDictionary auparavant, mais je n'ai pas eu de chance 2 -way liant à elle, principalement en raison de Key étant readonly – Maciek

+0

C'est pour cette raison que vous devez utiliser le KeyedCollection, qui dérive la clé de l'élément. De cette façon, vous lier à la propriété de l'élément qui contient la clé et le dictionnaire sera mis à jour en conséquence (peut-être). – user7116

2

Si vous regardez l'implémentation KeyValuePair, il s'agit d'une struct avec les propriétés Key et Value en tant que readonly, donc je suppose qu'il n'est pas possible de faire une liaison TwoWay dans ce cas.

Si vous créez une classe qui hérite de INotifyPropertyChange et qui gère le dictionnaire, ajoutez et supprimez des éléments lorsque vous modifiez la clé ou modifiez uniquement la valeur lorsque vous modifiez la valeur, cela fonctionne peut-être.

+0

Bonjour, j'ai du mal à accéder à ce lien. – Maciek

+0

OK J'ai rafraîchi le lien, allez y et cliquez sur chacune des propriétés Clé et Valeur et vous verrez qu'ils sont en lecture seule, seul le get est implémenté – jmayor

Questions connexes