我刚开始使用MVVM,遇到了一个障碍,我希望有人能帮助我。我正在尝试创建一个简单的视图,有2个列表框。从第一个列表框中选择的内容将填充第二个列表框。我创建了一个类,用于存储我想绑定到的信息。
MyObject类(可观察对象只是一个实现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>();
}
}
在我的视图模型中,我创建了两个ObservableCollections
public ObservableCollection<EMSMenuItem> Level1MenuItems { get; set; }
public ObservableCollection<EMSMenuItem> Level2MenuItems { get; set; }
在我的ViewModel的构造函数中,我有:
this.Level1MenuItems = new ObservableCollection<EMSMenuItem>();
this.Level2MenuItems = new ObservableCollection<EMSMenuItem>();
this.Level1MenuItems = LoadEMSMenuItems("Sample.Xml");
这对于Level1项很有效,并且它们正确地显示在视图中。但是,我有一个命令,当用户单击列表框中的项时会调用该命令,它包含以下内容:
Level2MenuItems = ClickedItem.SubCategories;
由于某些原因,这不会更新第二个列表框的UI。如果我在此位置放置断点,我可以看到Level2MenuItems中存储了正确的信息。如果我编写foreach循环并将它们分别添加到Level2MenuItems集合中,则它会正确显示。
同样作为测试,我向构造函数添加了以下内容:
Level2MenuItems = Level1MenuItems[0].SubCategories;
而且更新正确。
那么,为什么代码在构造函数中或循环时能够按预期工作,而在用户单击列表框中的项时却不能呢?
3条答案
按热度按时间u59ebvdq1#
您需要引发
Level2MenuItems
属性的变更告知。而不是拥有
您需要
前者在构造函数中起作用的原因是绑定还没有发生。但是,由于你是通过一个在绑定之后发生的命令执行来改变引用的,你需要告诉视图它发生了改变
jc3wubiy2#
您需要使ObservableCollection中的poco类实现INotifyPropertyChanged。
示例:
b4qexyjb3#
你的财产。