protected override void InsertItem(int index, T item) { string serialItem = ""; bool esitoSerial; esitoSerial = Serialize.SerializeInText(item, ref serialItem); var args = new BindListEventArgs(index, item); //ATTENZIONE:scateno l'evento BeforeInsertItem prima del MyBase.InsertItem(index, item), che ha sua volta scatena lo stesso evento nella classe da cui derivo... BeforeInsertItem?.Invoke(this, args); //in caso di sottoscrizione dell'evento, verrà comunque intercettato(correttamente) solomente 1 volta l'evento di questa classe e non quello da cui derivo if (args.interrompiOperazione == true) { return; } if (esitoSerial == false || defaultValueOfNewT == serialItem) //Si verifica quando il DataGrid aggiunge un item vuoto alla lista { //Aggiunto da dataGrid poichè ha valori di default (non è sicuro al 100% ma molto probabile), quindi non faccio il riordina altrimenti la nuova colonna... base.InsertItem(index, item); // ...non sarebbe più l'ultima e quindi il datagrid andrebbe in edit su un oggetto già esistente ovviamente sbagliando //OnListChanged(New ListChangedEventArgs(ListChangedType.ItemAdded, index)) } else { Items.Add(item); //A differenza di "base.InsertItem(index, item)" Non scatena l'aggiornamento dei Listener che fanno il binding sulla lista, mi serve aggiugere l'elemento, ordinare e poi segnalare ai listener Ordina(); } AfterInsertItem?.Invoke(this, args); //?.Invoke invice della parentesi tonda diretta poichè se nessuno ha sottoscritto l'evento non va in eccezione PropertyChangedEventHandler PropChangedOggT = new PropertyChangedEventHandler(CambioProprietaOggT); //Se il valore di una delle proprietà dei vari oggetti contenuti nella lista cambia, allora intercetto il cambiamento... typeof(T).GetEvent("PropertyChanged").AddEventHandler(item, PropChangedOggT); //...e verifico se la prop. concorre all'ordinamento degli items }
protected override void InsertItem(Int32 index, T item) { BindListEventArgs args = new BindListEventArgs(index, item); BeforeInsertItem?.Invoke(this, args); //?.Invoke invice della parentesi tonda diretta poichè se nessuno ha sottoscritto l'evento non va in eccezione if (args.interrompiOperazione == true) { return; } base.InsertItem(index, item); AfterInsertItem?.Invoke(this, args); //?.Invoke invice della parentesi tonda diretta poichè se nessuno ha sottoscritto l'evento non va in eccezione ItemNumberChanged?.Invoke(this, args); var PropertyChangedEH = new PropertyChangedEventHandler(CambioPropOggT); //Se il valore di una delle proprietà dei vari oggetti contenuti nella lista cambia, allora intercetto il cambiamento... typeof(T).GetEvent("PropertyChanged").AddEventHandler(item, PropertyChangedEH); //...e richiamo il metodo CambioPropOggT che a sua volta scatena l'evento CambioProprietàOggT }