ObservableCollection y CollectionChanged Event

¿Por qué el evento collectionchanged no se activa en el siguiente código, pero puedo ver la nueva instancia de InventoryBTO que agrego a ObservableCollection?

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) { } 

El problema es que está asignando a su miembro privado a una nueva instancia de una ObservableCollection que está recuperando de su método. Por lo tanto, lo que sucede es que estás conectado al evento de una colección, pero luego eliminas esa instancia y la reemplazas con una nueva instancia a la que nunca conectaste un controlador de eventos. Esto es lo que puedes hacer. Cree una clase que herede de ObservableCollection y agregue un método 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); } } } 

Entonces, puedes cambiar tu clase a esto:

 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... } 

Prueba esto

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

O

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

Dependiendo de su implementación.