ObservableCollection和CollectionChanged事件

为什么collectionchanged事件不会在下面的代码中触发,但是我可以看到我添加到ObservableCollection的新的InventoryBTO实例?

private ObservableCollection _inventoryRecords; public ObservableCollection InventoryRecords { get { return _inventoryRecords; } set { _inventoryRecords = value; } } private InventoryBTO _selectedRecord; public InventoryBTO SelectedRecord { get { return _selectedRecord; } set { if (_selectedRecord != value) { _selectedRecord = value; OnPropertyChanged(new PropertyChangedEventArgs("SelectedRecord")); } } } public InventoryViewModel() { if (_inventoryRecords == null) { InventoryRecords = new ObservableCollection(); this.InventoryRecords.CollectionChanged += new NotifyCollectionChangedEventHandler(InventoryRecords_CollectionChanged); } _inventoryRecords = InventoryListBTO.GetAllInventoryRecords(); } void InventoryRecords_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { } 

问题是您将私有成员分配给您从方法中获取的ObservableCollection的新实例。 因此,正在发生的事情是,你接触到一个集合的事件,然后吹掉那个实例并用一个你从未连接事件处理程序的新实例替换它。 这是你能做的。 创建一个inheritance自ObservableCollection的类并添加一个addrange方法:

 public class RangeObservableCollection : ObservableCollection { private bool surpressEvents = false; public void AddRange(IEnumerable items) { surpressEvents = true; foreach (var item in items) { base.Add(item); } this.surpressEvents = false; this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, items.ToList())); } protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { if (!this.surpressEvents) { base.OnCollectionChanged(e); } } } 

然后,您可以将您的课程更改为:

 private RangeObservableCollection _inventoryRecords; public RangeObservableCollection InventoryRecords { get { return _inventoryRecords; } set { _inventoryRecords = value; } } private InventoryBTO _selectedRecord; public InventoryBTO SelectedRecord { get { return _selectedRecord; } set { if (_selectedRecord != value) { _selectedRecord = value; OnPropertyChanged(new PropertyChangedEventArgs("SelectedRecord")); } } } public InventoryViewModel() { if (_inventoryRecords == null) { InventoryRecords = new ObservableCollection(); this.InventoryRecords.CollectionChanged += new NotifyCollectionChangedEventHandler(InventoryRecords_CollectionChanged); } this.InventoryRecords.AddRange(InventoryListBTO.GetAllInventoryRecords()); } void InventoryRecords_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { //e.NewItems will be an IList of all the items that were added in the AddRange method... } 

试试这个

 public ObservableCollection InventoryRecords { get { return _inventoryRecords; } set { _inventoryRecords = value; onPropertyChanged(this, "InventoryRecords"); } } 

要么

 public ObservableCollection InventoryRecords { get { return _inventoryRecords; } set { _inventoryRecords = value; OnPropertyChanged(new PropertyChangedEventArgs("InventoryRecords")); } } 

取决于您的实施。