2010-06-15 3 views
5

Почему событие, связанное с заменой, не запускается в следующем коде, но я вижу новый экземпляр InventoryBTO, который я добавляю в ObservableCollection?ObservableCollection and CollectionChanged Event

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

    } 
+1

выглядит, как вы подключите к коллекции в вашем CTOR, а затем сразу же замените ссылку на совершенно другую коллекцию. Возможно, вместо этого вы вместо этого захотите сделать AddRange? В любом случае наблюдаемая коллекция, которую вы создали, а затем подключенная к ней, давно ушла –

ответ

10

Проблема в том, что вы назначаете свой частный член новому экземпляру ObservableCollection, который вы возвращаете из своего метода. Поэтому происходит то, что вы подключаетесь к событию одной коллекции, но затем сдуваете этот экземпляр и заменяете его новым экземпляром, к которому вы никогда не подключали обработчик событий. Вот что вы можете сделать. Создайте класс, который наследуется от ObservableCollection и добавляет метод AddRange:

public class RangeObservableCollection<T> : ObservableCollection<T> 
{ 
    private bool surpressEvents = false; 

    public void AddRange(IEnumerable<T> 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<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... 
} 
+0

Первая строка указала на мою проблему. Поэтому я добавил обработчик события CollectionChanged на setter свойства. –

0

Попробуйте

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")); 

    } 
} 

В зависимости от реализации.

+0

всякий раз, когда значение установлено в свойство, будет вызван метод «onPropertyChanged», который, в свою очередь, вызывает событие PropertyChanged. – VoodooChild

+0

Не понимаю. Как событие PropertyChanged влияет на событие CollectionChanged коллекции при добавлении нового InventoryBTO? – user337816

+0

Также как вы могли бы получить доступ к свойствам внутри события с измененной коллекцией, которые содержат новые элементы. – user337816

Смежные вопросы