2009-04-22 11 views
12

मेरे पास दो अवलोकन करने योग्य चयन हैं और मुझे उन्हें एक सूची दृश्य नियंत्रण में दिखाने की आवश्यकता है। इस उद्देश्य के लिए मैंने MergedCollection बनाया जो इन दो संग्रहों को एक पर्यवेक्षण चयन के रूप में प्रस्तुत करता है। इस तरह से मैं अपने विलय संग्रह में ListView.ItemsSource सेट कर सकता हूं और दोनों संग्रह सूचीबद्ध हैं। काम करता है ठीक जोड़ा जा रहा है लेकिन जब मैं एक आइटम निकालने के लिए प्रयास करते हैं, बिना क्रिया का अपवाद दिखाया गया है:मर्ज किए गए वेरिएबल कोलेक्शन

An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll 
Additional information: Added item does not appear at given index '2'. 

MergedCollection के कोड इस प्रकार है:

public class MergedCollection : IEnumerable, INotifyCollectionChanged 
{ 
    ObservableCollection<NetworkNode> nodes; 
    ObservableCollection<NodeConnection> connections; 

    public MergedCollection(ObservableCollection<NetworkNode> nodes, ObservableCollection<NodeConnection> connections) 
    { 
     this.nodes = nodes; 
     this.connections = connections; 

     this.nodes.CollectionChanged += new NotifyCollectionChangedEventHandler(NetworkNodes_CollectionChanged); 
     this.connections.CollectionChanged += new NotifyCollectionChangedEventHandler(Connections_CollectionChanged); 
    } 

    void NetworkNodes_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     CollectionChanged(this, e); 
    } 

    void Connections_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     CollectionChanged(this, e); 
    } 

    #region IEnumerable Members 

    public IEnumerator GetEnumerator() 
    { 
     for (int i = 0; i < connections.Count; i++) 
     { 
      yield return connections[i]; 
     } 

     for (int i = 0; i < nodes.Count; i++) 
     { 
      yield return nodes[i]; 
     } 
    } 

    #endregion 

    #region INotifyCollectionChanged Members 

    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    #endregion 
} 

सादर

उत्तर

21

तो ऐसा कोई कारण आप नहीं कर सकते है CompositeCollection का उपयोग करें?

अपवाद को फेंकने का कारण यह है कि आप आंतरिक संग्रह की अनुक्रमणिका को बाहरी में अनुवाद नहीं कर रहे हैं। आप बाहरी घटना (MergedCollection पर) पर सटीक उसी ईवेंट के तर्क को पारित कर रहे हैं, यही कारण है कि डब्ल्यूपीएफ उन वस्तुओं को नहीं ढूंढता है जहां इंडेक्स उन्हें ढूंढने के लिए कह रहा है।

+0

कंपोजिट कोलेक्शन INotifyCollectionChanged लागू नहीं करता है। –

+1

@ जोश: यदि आप लिंक का पालन करते हैं, तो आप देखेंगे कि यह करता है। –

+0

:-)। तुम सही हो, केंट। यह बिल्कुल सही है. मैंने लिंक का पालन किया, लेकिन मैंने यह नहीं देखा कि संग्रह लागू करने वाले इंटरफेस दो लाइनों पर हैं! मैंने केवल आईलीस्ट को देखा! –

4

आपको अधिसूचना ईवेंट की अनुक्रमणिका को ऑफ़सेट करना होगा।

आप सूचकांक 2. पर पहले संग्रह से किसी आइटम को निकालने एक संग्रह बदल घटना सूचकांक 2.

साथ निकाल दिया जाता है आप सूचकांक 2 में दूसरे संग्रह से कोई आइटम निकाल देते हैं तो कहते हैं, घटना के साथ निकाल दिया जाता है एक ही सूचकांक (2), लेकिन आइटम को वास्तव में पहले संग्रह में सभी वस्तुओं के बाद गणना की जाती है।

+0

केंट का समाधान बेहतर है, लेकिन रिकॉर्ड के लिए, यहां मूल रूप से आपकी कक्षा के साथ गलत क्या था। –

+0

धन्यवाद, अब मैं समस्या को समझता हूं। अपवाद संदेश कभी-कभी मेरे लिए थोड़ा मुश्किल होते हैं। – Zefo

संबंधित मुद्दे