Почему collectionchanged событие не стреляет в следующий код, уже я вижу новый экземпляр InventoryBTO, который я добавляю к ObservableCollection?
private ObservableCollection<InventoryBTO> _inventoryRecords;
public ObservableCollection<InventoryBTO> 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<InventoryBTO>();
this.InventoryRecords.CollectionChanged += new NotifyCollectionChangedEventHandler(InventoryRecords_CollectionChanged);
}
_inventoryRecords = InventoryListBTO.GetAllInventoryRecords();
}
void InventoryRecords_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
}
Проблема в том, что вы назначаете свой закрытый член новому экземпляру ObservableCollection
, который вы возвращаете из своего метода. Следовательно, что происходит, вы подключаетесь к событию одной коллекции, но затем удаляете этот экземпляр и заменяете его новым экземпляром, к которому вы никогда не подключали обработчик событий. Вот что ты можешь сделать. Создайте класс, который наследуется от ObservableCollection
и добавляет метод addrange:
public class RangeObservableCollection<T> : ObservableCollection<T>
{
private bool supressEvents = false;
public void AddRange(IEnumerable<T> items)
{
supressEvents = true;
foreach (var item in items)
{
base.Add(item);
}
this.supressEvents = false;
this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, items.ToList()));
}
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (!this.surpressEvents)
{
base.OnCollectionChanged(e);
}
}
}
Затем вы можете изменить свой класс на этот:
private RangeObservableCollection<InventoryBTO> _inventoryRecords;
public RangeObservableCollection<InventoryBTO> 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<InventoryBTO>();
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<InventoryBTO> InventoryRecords
{
get { return _inventoryRecords; }
set
{
_inventoryRecords = value;
onPropertyChanged(this, "InventoryRecords");
}
}
ИЛИ
public ObservableCollection<InventoryBTO> InventoryRecords
{
get { return _inventoryRecords; }
set
{
_inventoryRecords = value;
OnPropertyChanged(new PropertyChangedEventArgs("InventoryRecords"));
}
}
В зависимости от вашей реализации.