I am just starting out with MVVM and hit the barrier and hope someone can help me. I am trying to create a simple view with two lists. The selection from the first list will be filled with the second list. I have a class that stores information that I want to bind.
MyObject Class (Observable Object - only the base class that implements 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>(); } }
In my view model, I have two ObservableCollections created
public ObservableCollection<EMSMenuItem> Level1MenuItems { get; set; } public ObservableCollection<EMSMenuItem> Level2MenuItems { get; set; }
In my ViewModel constructor, I have:
this.Level1MenuItems = new ObservableCollection<EMSMenuItem>(); this.Level2MenuItems = new ObservableCollection<EMSMenuItem>(); this.Level1MenuItems = LoadEMSMenuItems("Sample.Xml");
This works great for Level1 elements and they display correctly in the view. However, I have a command that is called when the user clicks an item in a list that has the following:
Level2MenuItems = ClickedItem.SubCategories;
For some reason, this does not update the user interface of the second list. If I put a breakpoint in this place, I see that Level2MenuItems has the correct information stored in it. If I write a foreach loop and add them separately to the Level2MenuItems collection, it will display correctly.
Also, as a test, I added the following to the constructor:
Level2MenuItems = Level1MenuItems[0].SubCategories;
And it is correctly updated.
So, why would the code work as expected in the constructor or when going through it, but not when the user clicks on an item in the list?
c # wpf mvvm observablecollection
David duncan
source share