2010-06-15 11 views
5

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

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

parece que conectarlo a la colección en su ctor e inmediatamente sobrescribe la referencia con una colección totalmente diferente. ¿Quizás en lugar de eso quisiste hacer un AddRange en lugar de sobreescribirlo? De cualquier manera, la colección observable que creó y luego se conectó desapareció hace mucho tiempo –

Respuesta

10

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

A continuación, puede cambiar su clase a este:

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 primera línea señaló mi problema. Así que agregué el controlador de eventos CollectionChanged en setter of of property. –

0

probar este

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

    } 
} 

Dependiendo de su aplicación.

+0

cada vez que se establece un valor en una propiedad, se llamará el método "onPropertyChanged" que a su vez genera el evento PropertyChanged. – VoodooChild

+0

No entiendo. ¿Cómo afecta el evento PropertyChanged al evento CollectionChanged de la colección cuando se agrega un nuevo InventoryBTO? – user337816

+0

Además, ¿cómo accedería a las propiedades dentro del evento de cambio de colección que contienen los nuevos elementos agregados? – user337816

Cuestiones relacionadas