2011-10-30 12 views
5

इस कोड के साथ क्या गलत है? बटन 1 पर क्लिक करने से संदेश बॉक्स प्रकट नहीं होता है।अवलोकन करने योग्य चयन संग्रह परिवर्तनित घटना फायरिंग नहीं लगती है - क्यों?

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

myClass के साथ परिभाषित:

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

संपादित करें: जब मैं के साथ एक 3 बटन जोड़ने:

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

यह संदेशबॉक्स प्रदर्शित करता है। और बटन 2 भी करता है। लेकिन बटन 1 पर क्लिक करने के बाद - अब कोई भी आग नहीं लगेगा। कैसे?

उत्तर

10

आप अपने क्षेत्र प्रारंभकर्ता से मूल ObservableCollection उदाहरण के लिए एक ईवेंट हैंडलर गयी।
आपने कभी भी फॉर्म से नए ObservableCollection उदाहरण में इवेंट हैंडलर नहीं जोड़ा।
चूंकि मूल ObservableCollection कभी भी नहीं बदलता है, इसलिए आपका हैंडलर कभी नहीं चलता है।

यह कई कारण collection properties should be read only (और they should be properties, not fields)

+0

संपादित देखें से एक है। यह कुछ मामलों में आग लगती है। – ispiro

+2

@ispiro: बिल्कुल। यह केवल तभी आग लगती है जब आप ** मूल ** 'पर्यवेक्षण योग्यता' को संशोधित करते हैं, न कि इसे बदलने के बाद। – SLaks

+1

संग्रह को पढ़ने के लिए केवल पुन: असाइनमेंट का खुलासा किया और मुझे कई सिरदर्द से बचाया। –