2013-04-02 3 views
2

J'ai une application qui montre certains ListBox. Ces ListBox sont liés à des données. Une des listes est une liste de portes, tandis que l'autre liste est une liste d'utilisateurs.Données liées dans WPF ne pas mettre à jour

La liste des portes provient d'une classe DataManager qui communique avec la base de données. La liste des utilisateurs provient d'une autre classe qui effectue des calculs.

J'ai lié les deux ListBox à leur setter getter observableList approprié.

Pour la porte:

public ObservableList<Door> Doors 
{ 
    get { return DataManager.Doors; } 
} 

et pour l'utilisateur:

public ObservableList<User> Users 
{ 
    get { return classLogic._users; } 
} 

vient ici le problème. Lorsque j'ajoute ou supprime une porte, la liste de l'interface utilisateur est mise à jour. Lorsque j'ajoute ou supprime un utilisateur, la liste n'est pas mise à jour. Je dois recharger l'affichage (redémarrer l'application) pour le mettre à jour. Qu'est-ce que je rate? Pourquoi ça ne marche pas?

Répondre

1

J'ai découvert moi-même qu'il y a trois étapes à accomplir. Je ne crois pas qu'un événement PropertyChanged est nécessaire pour mettre à jour le ListBox. Cela peut être depuis. NET 4.0 parce que j'ai lu dans les versions ci-dessous, la liaison de données n'est pas encore vraiment correcte. La première étape est que la liste doit être private static ObservableList<...>. La seconde est que le getter de cette liste doit aussi être le type approprié. Cela signifie que dans mon cas, le code suivant doit être ClassLogic:

private static readonly ObservableList<User> _users= new ObservableList<User>(); 

public static ObservableList<User> Users 
{ 
    get { return _users; } 
} 

Et la troisième chose est, lorsque vous appelez cette fonction (getter) dans la classe DataContext pour lier les données à la zone de liste, le nom de classe a à utiliser à la place d'une instance de cette classe!

Ainsi, dans ce cas, il serait:

/// <summary> 
/// Gets the Users that are managed by the ClassLogic class 
/// </summary> 
public ObservableList<User> Users 
{ 
    get { return ClassLogic.Users; } 
    //wrong would be: 
    //get { return classLogic.Users } 
} 

Ces 3 étapes liées mes données et fait en sorte que la zone de liste mise à jour lorsque le contenu de la liste a été mis à jour.

+1

bien, je me demande dans quelle situation est l'événement PropertyChanged nécessaire sur une propriété de collection je rappelle des situations où il était nécessaire. –

+0

Mes pensées exactement. Peut-être quand la liste n'est pas observable depuis le début? Je pense aux applications externes ou à la mise à jour de quelque chose qui n'est pas une liste mais, par exemple, une image ... – Joetjah

+0

Il existe une différence entre changer ObservableCollection lorsque vous mettez à jour la liste et modifier les éléments stockés dans la collection. Si les éléments de la collection sont modifiés, INotifyPropertyChanged peut être utilisé. De: http://stackoverflow.com/questions/9469056/refreshing-ui-after-update-to-a-listbox-bound-collection – Joetjah

2

une collection observable soulève PropertyChanged pour les propriétés de chaque élément
comme si vous aviez une propriété IsDoorClosed il actualiserait

la suppression d'un élément déclenche un événement CollectionChanged sur les portes, mais l'interface est pas mis à jour depuis un événement PropertyChanged n'a pas été levé sur les portes de la propriété Bound.

vous devez générer un événement PropertyChanged sur Doors sur chaque CollectionChanged de Doors. Quelque chose comme: c'est le code psado, il a été écrit ici pour pour votre bénéfice, alors vérifiez les erreurs de syntaxe.

Doors.CollectionChanged += OnDoorsCollectionChanged; 


private static void OnDoorsCollectionChanged(object sender , CollectionChangedEventArgs e) 
{ 
     PropertyChanged(sender,new PropertyChangedEventArgs("Doors")); 
} 
+0

Ok, comment je fais ça? – Joetjah

+0

Ok, j'ai ajouté un exemple, je ne sais pas où se trouve votre collection, mais vous devez augmenter PropertyChanged dans votre DataContext sur "Portes" propriété. notez également que je l'ai écrit ici et pas dans VS, alors prenez les erreurs de syntaxe en compte. –

+0

Eh bien, mais la partie amusante est, je n'ai pas fait cela sur la classe User. Pourtant, le ListBox de l'utilisateur est mis à jour. Comment est-ce possible? – Joetjah

Questions connexes