2010-06-15 11 views
5

Perché l'evento collectionchanged non viene generato nel seguente codice, tuttavia è possibile visualizzare la nuova istanza di InventoryBTO che aggiungo a ObservableCollection?ObservableCollection e 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

sembra si collega alla raccolta nel ctor e poi subito sovrascrivi il riferimento con una collezione totalmente diversa. Forse invece volevi fare un AddRange invece di sovrascriverlo? In entrambi i casi, la raccolta osservabile che hai creato e quindi collegata è passata da tempo –

risposta

10

Il problema è che stai assegnando il tuo membro privato a una nuova istanza di uno ObservableCollection che stai recuperando dal tuo metodo. Pertanto, ciò che sta accadendo è il collegamento con l'evento di una raccolta, ma poi l'eliminazione di quell'istanza e la sua sostituzione con una nuova istanza a cui non hai mai collegato un gestore di eventi. Ecco cosa puoi fare. Creare una classe che eredita da ObservableCollection e aggiunge un metodo 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); 
     } 
    } 
} 

Quindi, è possibile modificare la classe a questo:

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

La prima riga indicava il mio problema. Così ho aggiunto il gestore di eventi CollectionChanged sul setter di proprietà. –

0

Prova questa

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

    } 
} 

O

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

    } 
} 

seconda dell'implementazione.

+0

ogni volta che un valore è impostato su una proprietà, verrà chiamato il metodo "onPropertyChanged" che a sua volta aumenta l'evento PropertyChanged. – VoodooChild

+0

Non capisco. In che modo l'evento PropertyChanged influenza l'evento CollectionChanged della raccolta quando viene aggiunto un nuovo InventoryBTO? – user337816

+0

Inoltre, come si accede alle proprietà all'interno dell'evento modificato della raccolta che contiene i nuovi elementi aggiunti. – user337816

Problemi correlati