6

क्या कंपोजिट कोलेक्शन का वर्तमान स्थान बदलता है जब अधिसूचित होने का कोई तरीका है?संग्रह दृश्य सुविधाओं के साथ एक समग्र चयन को कैसे संभालें?

मुझे संग्रह दृश्य द्वारा निगरानी की गई समग्र चयन की आवश्यकता है, किसी भी विचार का स्वागत है।

उत्तर

6

आप अपने संग्रह दृश्य के ICollectionView.CurrentChanged ईवेंट की निगरानी करके वर्तमान आइटम बदलते समय पता लगा सकते हैं। निम्नलिखित कोड मेरे लिए काम करता है:

CompositeCollection cc = new CompositeCollection(); 
cc.Add(new CollectionContainer { Collection = new string[] { "Oh No!", "Fie" } }); 
cc.Add(new CollectionContainer { Collection = new string[] { "Zounds", "Ods Bodikins" } }); 
CollectionViewSource cvs = new CollectionViewSource { Source = cc }; 

// Subscribing to CurrentChanged on the ICollectionView 
cvs.View.CurrentChanged += (o, e) => MessageBox.Show("current changed"); 

lb.ItemsSource = cvs.View; // lb is a ListBox with IsSynchronizedWithCurrentItem="True" 

जब मैं सूची बॉक्स में चयन बदलता हूं, तो संदेश बॉक्स प्रदर्शित होता है।

अरन के उत्तर के अनुसार फ़िल्टरिंग, सॉर्टिंग और ग्रुपिंग के संबंध में ये कंपोजिट कोलेक्शन पर एक दृश्य पर उपलब्ध नहीं हैं। लेकिन रिकार्ड के लिए यहाँ तरीकों से आप को देखता है समर्थन इन सुविधाओं कर के लिए परिवर्तन का पता लगाने कर सकते हैं:

  • ऐसा लगता है कि आप एक CollectionChanged घटना मिलेगा जब फिल्टर परिवर्तन, हालांकि मैं नहीं मिल सकता है दस्तावेज।
  • सॉर्ट डिस्क्रिप्शन सॉर्ट डिस्क्रिप्शन कोलाइजेशन है जो INotifyCollectionChanged है, तो सॉर्टडिस्क्रिप्शन प्रॉपर्टी पर संग्रह संग्रह ईवेंट हैंडलर को हुक करें।
  • ग्रुप डिस्क्रिप्शन ObservableCollection<GroupDescription> है, इसलिए ग्रुप डिस्क्रिप्शन प्रॉपर्टी पर कलेक्शन चेंज इवेंट हैंडलर को हुक करें।
+0

समस्या यह है कि मैं कंपोजिट कोलेक्शन का उपयोग कर रहा हूं जो दो अलग संग्रहव्यू स्रोत स्रोतों से जुड़ा हुआ है। जब मैंने ListBox में स्थान बदल दिया (जो IsSynchronizedWithCurrentItem स्पष्ट रूप से सत्य पर सेट है) CurrentChanging (ed) को निकाल दिया नहीं गया है। – Shimmy

+0

तो आपके पास एक ही संग्रह में दो सीवीएस हैं? बेवकूफ सवाल, लेकिन क्या आप वाकई सही सीवीएस पर घटना की सदस्यता ले रहे हैं। देखें? सुझाव है कि आप उस कोड को दिखाने के लिए प्रश्न अपडेट करें जो काम नहीं कर रहा है। – itowlson

+0

शायद आप मुझे बताएं कि यह कैसे करें। वांछित है CurrentChanging की निगरानी की जानी चाहिए। मेरे सभी प्रयासों से निष्कर्ष यह है कि घटना को निकाल दिया नहीं गया है। यह एक गूंगा क्वेस्टिन नहीं है, मुझे लगता है कि यह इससे अधिक जटिल है; मेरी इच्छा है कि यह नहीं है। – Shimmy

0

आप एक copmposite संग्रह पर एक CollectionView चलाने नहीं कर सकते, देख here

+0

सॉर्टिंग और फ़िल्टरिंग मेरे लिए कम महत्वपूर्ण है। शीर्ष प्राथमिकता CurrentChanging है। बीटीडब्ल्यू उपरोक्त itowlson के साथ मेरी चर्चा पर एक नज़र डालें, वह कहता है कि वह जल्द ही कोड पोस्ट करने जा रहा है। आइए देवताओं के लिए आशा करें ... – Shimmy

+0

आप कर सकते हैं, क्योंकि मुद्रा कैसे काम करती है - हालांकि सीमाओं को महसूस नहीं किया गया - धन्यवाद! – itowlson

0

मैं एक ही समस्या में पड़ गए: मैं एक CompositeCollection की छँटाई की जरूरत। मैंने निम्न वर्ग लिखा है जो कम से कम एक ही प्रकार के पर्यवेक्षण चयन के लिए समस्या हल करता है।

विचार समग्र संग्रह को एक सामान्य अवलोकन संग्रह के रूप में बनाए रखना है, और अंतर्निहित संग्रह परिवर्तन के रूप में इसे अपडेट करना है। फिर परिणामस्वरूप संग्रह (ऑलनोड) का उपयोग उपयोगकर्ता इंटरफ़ेस में किया जा सकता है, और यह संग्रह दृश्य को ठीक से समर्थन देता है।

using System.Collections.ObjectModel; 
using System.Collections.Specialized; 
using System.Linq; 

namespace Util { 
    public class ObservableCollectionCollector<T> { 
     private class ReplacableObservableCollection : ObservableCollection<T> { 
      public void Replace(int idx, T v) { 
       SetItem(idx, v); 
      } 
     } 
     private readonly ReplacableObservableCollection allNodes; 
     private readonly ObservableCollection<T>[] colls; 
     private readonly int[] lens; 

     public ObservableCollectionCollector(params ObservableCollection<T>[] colls) { 
      this.colls = colls; 
      allNodes = new ReplacableObservableCollection(); 
      foreach (var l in colls) { 
       foreach (var e in l) 
        allNodes.Add(e); 
       l.CollectionChanged += HandleCollectionChanged; 
      } 
      lens = colls.Select(c => c.Count).ToArray(); 
     } 

     public ReadOnlyObservableCollection<T> AllNodes { 
      get { return new ReadOnlyObservableCollection<T>(allNodes); } 
     } 

     private void HandleCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { 
      int i0 = 0; 
      int ci = 0; 
      foreach (var l in colls) { 
       if (l == sender) 
        break; 
       i0 += l.Count; 
       ++ci; 
      } 
      switch (e.Action) { 
       case NotifyCollectionChangedAction.Add: 
        for (int i = 0; i < e.NewItems.Count; ++i) 
         allNodes.Insert(i0 + e.NewStartingIndex + i, (T)e.NewItems[i]); 
        break; 
       case NotifyCollectionChangedAction.Move: 
        for (int i = 0; i < e.OldItems.Count; ++i) 
         allNodes.Move(i0 + e.OldStartingIndex + i, i0 + e.NewStartingIndex + i); 
        break; 
       case NotifyCollectionChangedAction.Remove: 
        for (int i = 0; i < e.OldItems.Count; ++i) 
         allNodes.RemoveAt(i0 + e.OldStartingIndex); 
        break; 
       case NotifyCollectionChangedAction.Replace: 
        for (int i = 0; i < e.NewItems.Count; ++i) 
         allNodes.Replace(i0 + e.OldStartingIndex + i, (T)e.NewItems[i]); 
        break; 
       case NotifyCollectionChangedAction.Reset: 
        for (int i = 0; i < lens[ci]; ++i) 
         allNodes.RemoveAt(i0); 
        break; 
      } 
      lens[ci] = ((ObservableCollection<T>)sender).Count; 
     } 
    } 
} 
संबंधित मुद्दे