2010-07-27 8 views
1

J'utilise WPF et C# J'ai un bouton qui ouvre une fenêtre, qui comprend également un bouton qui ajoute un objet Utilisateur à une liste et je veux que l'index de la liste soit mis à jour après insertion. J'ai compris que la solution consiste à utiliser la classe observable de INotifyCollectionChanged mais en fait je ne sais pas comment et où les utiliser. Pouvez-vous me aider à déterminer quoi et où la mise en œuvre, inscrivez-vous, le feu, etc.Mise à jour de la liste après l'ajout d'un nouvel article


Edit: je réussissais ce avec l'aide de Quartermeister où mon objet utilisateur est recueillie dans une liste, mais maintenant je veux faire la même chose où mon objet est collecté dans un dictionnaire

Répondre

4

La manière la plus simple est d'utiliser System.Collections.ObjectModel.ObservableCollection<T> comme liste. Cela implémente INotifyCollectionChanged et INotifyPropertyChanged pour vous.

Vous possédez une propriété sur votre objet DataContext de ce type et utilisez la liaison de données sur ListBox.ItemsSource pour le lier à cette propriété. Le ListBox mettra à jour automatiquement sa liste d'éléments lorsque la collection change.

Dans la classe qui est votre DataContext:

public class MyClass 
{ 
    public ObservableCollection<string> Items { get; set; } 
} 

En XAML:

<ListBox ItemsSource="{Binding Items}"> 
</ListBox> 

On dirait que vous voulez aussi un dictionnaire observable, mais malheureusement il n'y a pas un construit en le cadre. Vous pouvez essayer d'utiliser l'implémentation de ObservableDictionary du Dr. Wpf à partir de son article "Can I bind my ItemsControl to a dictionary?".

+0

C'était une solution assez facile et utile. Merci beaucoup =) – cemregoksu

+0

et une question de plus: et si je veux utiliser un dictionnaire au lieu d'une liste? comment puis-je gérer cela? – cemregoksu

+0

je viens de trouver un keyedcollection et maintenant l'essayer it.j'espère que cela fonctionne =) t – cemregoksu

0

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.

Questions connexes