ObservableCollection pas la mise à jour de la Vue
Je commence tout juste avec MVVM et ont frappé un obstacle que j'espère que quelqu'un peut m'aider avec. Je suis en train de créer une Vue simple avec 2 zones de liste. Une sélection à partir de la première zone de liste s'affichent la deuxième zone de liste. J'ai une classe créée qui stocke les informations que je souhaite lier à.
MyObject Classe (Objet observé est juste une classe qui implémente INotifyPopertyChanged)
public class MyObject : ObservableObject
{
String _name = String.Empty;
ObservableCollection<MyObject> _subcategories;
public ObservableCollection<MyObject> SubCategories
{
get { return _subcategories; }
set
{
_subcategories = value;
RaisePropertyChanged("SubCategories");
}
}
public String Name
{
get { return _name; }
set
{
_name = value;
RaisePropertyChanged("Name");
}
}
public MyObject()
{
_subcategories = new ObservableCollection<EMSMenuItem>();
}
}
Dans mon viewmodel j'ai deux ObservableCollections créé
public ObservableCollection<EMSMenuItem> Level1MenuItems { get; set; }
public ObservableCollection<EMSMenuItem> Level2MenuItems { get; set; }
Dans mon constructeur du ViewModel j'ai:
this.Level1MenuItems = new ObservableCollection<EMSMenuItem>();
this.Level2MenuItems = new ObservableCollection<EMSMenuItem>();
this.Level1MenuItems = LoadEMSMenuItems("Sample.Xml");
Qui fonctionne très bien pour le Niveau 1 articles et ils afficher correctement dans la Vue. Toutefois, j'ai une commande qui est appelé lorsque l'utilisateur clique sur un élément dans la zone de liste, qui est la suivante:
Level2MenuItems = ClickedItem.SubCategories;
Pour une raison quelconque, cela ne met pas à jour l'INTERFACE utilisateur de la deuxième zone de liste. Si j'ai mis un point d'arrêt à cet endroit, je peux voir que Level2MenuItems a la bonne information qui y est stockée. Si j'écris une boucle foreach et les ajouter individuellement à la Level2MenuItems collection alors il ne s'affiche pas correctement.
Aussi comme un test, j'ai ajouté ce qui suit à l'constructeur:
Level2MenuItems = Level1MenuItems[0].SubCategories;
Et que, mis à jour correctement.
Alors pourquoi le code fonctionne comme prévu dans le constructeur, ou si la boucle à travers, mais pas lorsqu'un utilisateur clique sur un item de la listbox?
OriginalL'auteur David Duncan | 2011-12-18
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour élever la notification de changement sur le
Level2MenuItems
propriété.Au lieu d'avoir
vous avez besoin
La raison pour laquelle les anciens travaux dans le constructeur, c'est que la Liaison n'a pas encore eu lieu. Cependant, puisque vous êtes la modification de la référence par l'intermédiaire d'une commande à exécuter ce qui se produit après la liaison, vous devez dire à la vue qu'elle a changé
OriginalL'auteur aqwert
Vous avez besoin pour faire de votre poco classe au sein de l'ObservableCollection implémenter INotifyPropertyChanged.
Exemple:
OriginalL'auteur Scott Nimrod
Votre
Subcategories
propriété doit être en lecture seule.Je suppose qu'il a de la définition de la propriété.
OriginalL'auteur SLaks