2011-10-30 27 views
5

Có gì sai với mã này? Nhấp vào button1 không làm cho MessageBox xuất hiện.Bộ sưu tập sưu tập sưu tập có thể quan sátĐối với sự kiện có vẻ không được kích hoạt - tại sao?

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

Với myClass định nghĩa:

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: Khi tôi thêm một nút thứ 3 với:

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

nó thể hiện messageBox. Và nút 2 cũng vậy. Nhưng sau khi nhấp vào button1 - không ai sẽ kích hoạt nữa. Làm thế nào mà?

Trả lời

10

Bạn đã thêm trình xử lý sự kiện vào phiên bản ObservableCollection gốc từ trình khởi tạo trường của bạn.
Bạn chưa bao giờ thêm trình xử lý sự kiện vào cá thể ObservableCollection mới từ biểu mẫu.
Vì bản gốc ObservableCollection không bao giờ thay đổi, trình xử lý của bạn không bao giờ chạy.

Đây là một trong những lý do tại sao nhiều collection properties should be read only (và they should be properties, not fields)

+0

Xem chỉnh sửa. Nó cháy trong một số trường hợp. – ispiro

+2

@ispiro: Chính xác. Nó chỉ kích hoạt khi bạn sửa đổi ** original ** 'ObservableCollection', chứ không phải sau khi bạn thay thế nó. – SLaks

+1

Làm cho bộ sưu tập chỉ được tiết lộ chỉ định lại và lưu tôi khỏi rất nhiều đau đầu. –

Các vấn đề liên quan