2012-06-04 23 views
11

में आइटम जोड़ा जाता है तो मैं एक ईवेंट बढ़ाता हूं, मैं WPF पर काम कर रहा हूं और मैं एक सूची दृश्य का उपयोग कर रहा हूं, और जब कोई आइटम इसमें जोड़ा जाता है तो मुझे किसी ईवेंट को आग लगाना पड़ता है। मैं इस की कोशिश की है: event-fired-when-item-is-added-to-listview, लेकिन सबसे अच्छा जवाब:डब्ल्यूपीएफ: जब सूची सूची दृश्य

var dependencyPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(ItemsControl.ItemsSourceProperty, typeof(ListView)); 
     if (dependencyPropertyDescriptor != null) 
     { 
       dependencyPropertyDescriptor.AddValueChanged(this, ItemsSourcePropertyChangedCallback); 
     } 

.....

private void ItemsSourcePropertyChangedCallback(object sender, EventArgs e) 
    { 
     RaiseItemsSourcePropertyChangedEvent(); 
    } 

लेकिन यह काम करने पर ही पूरे संग्रह बदल गया है लगता है, मैं इस पोस्ट को पढ़ लिया है केवल एक सूची बॉक्स के लिए लागू होता है। मैंने सूची को सूची दृश्य में बदलने की कोशिश की लेकिन मैं ऐसा करने में सक्षम नहीं था।

मुझे आशा है कि आप मेरी मदद कर सकते हैं। पहले ही, आपका बहुत धन्यवाद।

+0

आपके द्वारा पोस्ट किए गए प्रश्न के उत्तर की टिप्पणियों में आपको "अधिक स्पष्ट करने के लिए उपरोक्त मेरा कोड संशोधित किया जाएगा। इसके अलावा इसे किसी भी आइटम कंट्रोल (लिस्टबॉक्स या लिस्ट व्यू) के साथ काम करना चाहिए। "- आपको विशेष रूप से क्या समस्या है? – Slugart

+0

@Slugart आपके उत्तर के लिए धन्यवाद, मेरी समस्या यह है कि विधि 'BeginInvoke' घोषणा को स्वीकार नहीं करती है उदाहरण। यह कहता है कि 'डिस्पैचर प्रवासीता' मौजूद नहीं है – Dante

उत्तर

37

ध्यान दें कि यह केवल एक WPF सूचीदृश्य के लिए काम करता है!

कुछ शोध करने के बाद मैं अपने सवाल का जवाब मिल गया है और यह वास्तव में आसान है:

public MyControl() 
{ 
    InitializeComponent(); 
    ((INotifyCollectionChanged)listView.Items).CollectionChanged += ListView_CollectionChanged; 
} 

private void ListView_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)  
{ 
    if (e.Action == NotifyCollectionChangedAction.Add) 
    { 
     // scroll the new item into view 
     listView.ScrollIntoView(e.NewItems[0]); 
    } 
} 

वास्तव में, NotifyCollectionChangedAction enum अपने कार्यक्रम जैसे किसी भी परिवर्तन के बारे में सूचित कर सकते हैं: जोड़ें, ले जाएँ, बदलें , निकालें और रीसेट करें।

+1

यह मेरे लिए काम नहीं करता है। मुझे 'SystemVelections.Specialized.InotifyCollectionChanged' टाइप करने के लिए 'ListViewItemCollection' प्रकार का ऑब्जेक्ट डालने में असमर्थता है। –

+1

किसी और के लिए जो उत्सुक है, 'ListView।आइटम 'टाइप करें 'आइटमकोलेक्शन'। यह 'संग्रह दृश्य' से प्राप्त होता है जो 'INotifyCollectionChanged 'लागू करता है। एमएसडीएन को देखते हुए, यह .NET 3.0 - 4.6 के लिए सच था। @Arvo 'ListViewItemCollection' केवल 'IList, ICollection, IENumerable' लागू करता है और किसी भी चीज़ से प्राप्त नहीं होता है, इसलिए आपका अपवाद। –

+0

WPF Listbox के साथ भी काम करता है। यदि एक अवलोकन योग्य बाध्य है, तो पहली घटना को दृश्य में लाया जाएगा! तो यदि एक ही मान कई बार हो सकता है, तो एक संपत्ति के साथ एक वर्ग का उपयोग करें (अवलोकन योग्यता ) और तदनुसार DisplayMemberPath सेट करें। – dba

-1

नोट: यह समाधान WinForms ListView के लिए था।

मेरे मामले मैं 2 विकल्पों के साथ सड़क में एक कांटा के लिए आ रहा समाप्त हो गया में ...

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


(2) हर के साथ जोड़ने, हटाने, या स्पष्ट कॉल सूचीदृश्य को मैं भी एक और समारोह CollectionChanged घटना का अनुकरण कहा जाता है।

समारोह की तरह नई घटना बनाएं ...

private void myListViewControl_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    //The projects ListView has been changed 
    switch (e.Action) 
    { 
     case NotifyCollectionChangedAction.Add: 
      MessageBox.Show("An Item Has Been Added To The ListView!"); 
      break; 
     case NotifyCollectionChangedAction.Reset: 
      MessageBox.Show("The ListView Has Been Cleared!"); 
      break; 
    } 
} 

कहीं ListView में एक आइटम जोड़ें ...

ListViewItem lvi = new ListViewItem("ListViewItem 1"); 
lvi.SubItems.Add("My Subitem 1"); 
myListViewControl.Items.Add(lvi); 
myListViewControl_CollectionChanged(myListViewControl, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, lvi, lvi.Index)); 

साफ़ ListView कहीं और ...

myListViewControl.Items.Clear(); 
myListViewControl_CollectionChanged(myListViewControl, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 
+0

यह बहुत विचित्र है कि दांते का समाधान आपके लिए काम नहीं करता है, खासकर जब आपके कार्य-आसपास में शामिल होता है ... 'INotifyCollectionChanged'। '((INotifyCollectionChanged) MyList.Items)। चयन परिवर्तन + = MyListChanged' मेरे लिए काम किया। क्या आप वाकई कोष्ठक को सही जगहों पर रखते हैं? –

+0

शायद इसमें डब्ल्यूपीएफ के साथ कुछ करना है, मैं इसका उपयोग नहीं करता, मैं WinForms का उपयोग कर रहा हूं। निश्चित नहीं है, मुझे पता है कि सभी नामस्थानों के लिए जिम्मेदार है और सभी संदर्भ उन वस्तुओं/प्रकारों के साथ सही काम करते हैं। मैं वास्तव में यह भी नहीं समझता कि आप सूची का संग्रह कैसे डाल सकते हैं। देखें IotifyCollectionChanged (यह नहीं कह रहा कि यह नहीं किया जा सकता है, मुझे बस यह नहीं मिला)। बाकी सब कुछ उस हिस्से को छोड़कर अच्छा दिखता है। यदि आप मुझे बताते हैं तो मैं कुछ और करने की कोशिश करने के लिए तैयार हूं। लेकिन जैसा कि यह मेरा वीएस 2010 खड़ा है कहते हैं! ;) –

+2

विनफॉर्म और डब्ल्यूपीएफ दो पूरी तरह से अलग जानवर हैं; एक WinForms 'ListView' में WPF 'ListView' के साथ ** कुछ भी नहीं है **! WPF 'ListViewItemCollection' लागू करता है' INotifyCollectionChanged'; यह सूची में परिवर्तनों का पता लगाने के लिए डब्ल्यूपीएफ की शक्तिशाली डेटा बाइंडिंग क्षमताओं की अनुमति देता है और [लगभग] * स्वचालित रूप से * सबकुछ अद्यतित रखता है। आपको WinForms को पीछे छोड़कर और डब्ल्यूपीएफ की कोशिश करने पर विचार करना चाहिए - एक बार जब आप इसे लटका लेंगे, तो आप कभी वापस नहीं देखेंगे! :) –

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