ObservableCollection未更新View

我刚开始使用MVVM并遇到了障碍,我希望有人可以帮助我。 我正在尝试使用2个列表框创建一个简单的视图。 第一个列表框中的选择将填充第二个列表框。 我创建了一个类,用于存储我想要绑定的信息。

MyObject类(Observable Object只是一个实现INotifyPopertyChanged的基类)

public class MyObject : ObservableObject { String _name = String.Empty; ObservableCollection _subcategories; public ObservableCollection 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(); } } 

在我的viewmodel中,我创建了两个ObservableCollections

 public ObservableCollection Level1MenuItems { get; set; } public ObservableCollection Level2MenuItems { get; set; } 

在我的ViewModel的构造函数中,我有:

 this.Level1MenuItems = new ObservableCollection(); this.Level2MenuItems = new ObservableCollection(); this.Level1MenuItems = LoadEMSMenuItems("Sample.Xml"); 

这适用于Level1项目,它们在视图中正确显示。 但是,当用户单击列表框中的项目时,我会调用一个命令,该命令具有以下内容:

 Level2MenuItems = ClickedItem.SubCategories; 

由于某种原因,这不会更新第二个列表框的UI。 如果我在这个位置放置一个断点,我可以看到Level2MenuItems中存储了正确的信息。 如果我编写一个foreach循环并将它们单独添加到Level2MenuItems集合中,那么它会正确显示。

另外作为测试,我将以下内容添加到构造函数中:

 Level2MenuItems = Level1MenuItems[0].SubCategories; 

而且更新正确。

那么为什么代码在构造函数中按预期工作,或者在循环时,而不是在用户单击列表框中的项目时?

您需要在Level2MenuItems属性上引发更改通知。

而不是拥有

 public ObservableCollection Level2MenuItems { get; set; } 

你需要

 private ObservableCollection _level2MenuItems; public ObservableCollection Level2MenuItems { get { return _level2MenuItems; } set { _level2MenuItems = value; RaisePropertyChanged("Level2MenuItems"); } } 

前者在构造函数中工作的原因是Binding还没有发生。 但是,由于您通过命令执行更改引用,这在绑定之后发生,您需要告诉视图它已更改

您需要在ObservableCollection实现INotifyPropertyChanged中创建您的poco类。

例:

  . . .            public class LocationViewModel : BaseViewModel { ObservableCollection _locations = new ObservableCollection(); public ObservableCollection Locations { get { return _locations; } set { if (_locations != value) { _locations = value; OnNotifyPropertyChanged(); } } } } public class Location : BaseViewModel { int _locationId = 0; public int LocationId { get { return _locationId; } set { if (_locationId != value) { _locationId = value; OnNotifyPropertyChanged(); } } } string _name = null; public string Name { get { return _name; } set { if (_name != value) { _name = value; OnNotifyPropertyChanged(); } } } float _latitude = 0; public float Latitude { get { return _latitude; } set { if (_latitude != value) { _latitude = value; OnNotifyPropertyChanged(); } } } float _longitude = 0; public float Longitude { get { return _longitude; } set { if (_longitude != value) { _longitude = value; OnNotifyPropertyChanged(); } } } } public class BaseViewModel : INotifyPropertyChanged { #region Events public event PropertyChangedEventHandler PropertyChanged; #endregion protected void OnNotifyPropertyChanged([CallerMemberName] string memberName = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(memberName)); } } } 

您的Subcategories属性应该是只读的 。