La mise en œuvre d'un dictionnaire observable est difficile. Il est beaucoup plus simple de maintenir une collection observable parallèle, qui contient les valeurs du dictionnaire. Liez la vue à cette collection et assurez-vous que tout code qui ajoute ou supprime des valeurs du dictionnaire met à jour le dictionnaire et la collection parallèle.
Si vous voulez vraiment devenir fou, vous pouvez mettre en place une sous-classe de ObservableCollection
pour tenir vos objets, et faire cette classe maintenir le dictionnaire, par exemple:
public class KeyedObject
{
public string Key { get; set; }
public object Value { get; set; }
}
public class ObservableMappedCollection : ObservableCollection<KeyedObject>
{
private Dictionary<string, KeyedObject> _Map;
public ObservableMappedCollection(Dictionary<string, KeyedObject> map)
{
_Map = map;
}
protected override void InsertItem(int index, KeyedObject item)
{
base.InsertItem(index, item);
_Map[item.Key] = item;
}
protected override void RemoveItem(int index)
{
KeyedObject item = base[index];
base.RemoveItem(index);
_Map.Remove(item.Key);
}
protected override void ClearItems()
{
base.ClearItems();
_Map.Clear();
}
protected override void SetItem(int index, KeyedObject item)
{
KeyedObject oldItem = base[index];
_Map.Remove(oldItem.Key);
base.SetItem(index, item);
_Map[item.Key] = item;
}
}
Il y a un tas de problèmes potentiels dans la ci-dessus, ayant principalement à voir avec des valeurs clés en double. Par exemple, que devrait faire SetItem
si vous ajoutez un objet dont la clé est déjà dans la carte? La réponse dépend vraiment de votre application. Des problèmes comme celui-ci indiquent également pourquoi il n'y a pas de classe de dictionnaire observable dans le framework.
C'était une solution assez facile et utile. Merci beaucoup =) – cemregoksu
et une question de plus: et si je veux utiliser un dictionnaire au lieu d'une liste? comment puis-je gérer cela? – cemregoksu
je viens de trouver un keyedcollection et maintenant l'essayer it.j'espère que cela fonctionne =) t –
cemregoksu