2011-10-30 10 views
5

Cosa c'è di sbagliato con questo codice? Facendo clic su button1 non viene visualizzato il messageBox.ObservableCollection Collection L'evento modificato sembra non sparare - perché?

public partial class Form1 : Form 
{ 
    public ObservableCollection<string> aCollection2 = new ObservableCollection<string>(); 
    myClass mc = new myClass(); 

    public Form1() 
    { 
     InitializeComponent(); 

     aCollection2.Add("a"); 
     aCollection2.Add("b"); 
    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     mc.myCollection = aCollection2; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     mc.myCollection.Clear(); 
    } 
} 

Con myClass definito:

class myClass 
{ 
    public ObservableCollection<string> myCollection = new ObservableCollection<string>(); 

    public myClass() 
    { 
     myCollection.CollectionChanged += Changed; 
    } 

    void Changed(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     MessageBox.Show(myCollection.Count.ToString()); 
    } 
} 

EDIT: Quando aggiungo un terzo pulsante con:

private void button3_Click(object sender, EventArgs e) 
{ 
    mc.myCollection.Add("a"); 
} 

Mostrano il messageBox. E così fa button2. Ma dopo aver cliccato sul pulsante 1 - nessuno sparerà più. Come mai?

risposta

10

È stato aggiunto un gestore eventi all'istanza originale ObservableCollection dall'inizializzatore del campo.
Non è mai stato aggiunto un gestore di eventi alla nuova istanza ObservableCollection dal modulo.
Poiché l'originale ObservableCollection non cambia mai, il gestore non viene mai eseguito.

Questo è uno dei tanti motivi per cui collection properties should be read only (e they should be properties, not fields)

+0

Guarda modifica. Spara in alcuni casi. – ispiro

+2

@ispiro: esattamente. Si attiva solo quando si modifica ** l'originale ** "ObservableCollection", non dopo la sua sostituzione. – SLaks

+1

Rendere la raccolta di sola lettura ha rivelato riassegnazioni e mi ha salvato da molti mal di testa. –

Problemi correlati