2011-10-30 6 views
5

Co jest nie tak z tym kodem? Kliknięcie przycisku 1 nie powoduje pojawienia się komunikatu.ObservableCollection Collection Wydarzenie, które się zmieniło, wydaje się nie uruchamiać - dlaczego?

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(); 
    } 
} 

Z myClass zdefiniowane:

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: Kiedy dodać 3rd przycisk z:

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

To ma pokazać MessageBox. Podobnie jak przycisk 2. Ale po kliknięciu przycisku 1 - żaden nie będzie już strzelał. Dlaczego?

Odpowiedz

10

Dodałeś obsługę zdarzeń do oryginalnej instancji ObservableCollection z inicjatora pola.
Nigdy nie dodano obsługi zdarzenia do nowej instancji ObservableCollection z formularza.
Ponieważ oryginalny ObservableCollection nigdy się nie zmienia, program obsługi nigdy nie działa.

Jest to jeden z wielu powodów, dlaczego collection properties should be read only (i they should be properties, not fields)

+0

Zobacz zmienił. W niektórych przypadkach jest uruchamiany. – ispiro

+2

@ispiro: Dokładnie. Występuje tylko wtedy, gdy modyfikujesz ** oryginalny "ObservableCollection", a nie po jego zastąpieniu. – SLaks

+1

Uczynienie kolekcji tylko do odczytu odsłoniło i uratowało mnie od wielu bólów głowy. –

Powiązane problemy