2012-01-24 27 views
16

मेरे पास एक डाटाग्रिड है जो ObservableCollection<Product> से जुड़ा हुआ है। जब ग्रिड अपडेट किया जाता है तो यह स्वचालित रूप से मेरे संग्रह में उत्पाद ऑब्जेक्ट को अपडेट करता है।यह पता लगाने के लिए कि क्या मेरे ऑब्जर्जेबल कोलेक्शन में कोई आइटम बदल गया है

अब मैं क्या करना चाहता हूं कि संग्रह में किसी ऑब्जेक्ट को अद्यतन होने पर भी कुछ प्रकार का ट्रिगर किया जाता है-या- संग्रह के लिए बाध्यकारी कुछ प्रकार जो किसी भी उत्पाद के पास सही/झूठी डिप्लेन्ट लौटाएगा अद्यतन किया गया है।

समग्र उद्देश्य मेरे मुख्य विंडो पर एक सेव बटन रखना है जो अक्षम है यदि मेरे संग्रह में कोई बदलाव नहीं किया गया है और परिवर्तन किए जाने पर सक्षम है।

मैंने INotifyPropertyChange में पढ़ा है, लेकिन मैं नहीं देखता कि मैं पूरे संग्रह में परिवर्तनों की निगरानी के लिए इसका उपयोग कैसे कर सकता हूं।

इसके अतिरिक्त, अगर मैं अपने उत्पाद वर्ग पर इस इंटरफेस को लागू करता हूं तो मैं नहीं देखता कि मेरा यूआई संग्रह में प्रत्येक उत्पाद की निगरानी कैसे कर सकता है - या यह कर सकता है?

+1

यहां देखें: http: // stackoverflow।कॉम/प्रश्न/1427471/अवलोकन योग्य चयन-नोट-नोटिस-जब-आइटम-इन-इन-चेंज-इन-इन-इन-इनोटिफ़प्रॉप – SwDevMan81

+1

मैं इसका उपयोग कर रहा हूं: http://stackoverflow.com/questions/8490533/notify-observablecollection -वें-आइटम-परिवर्तन – Noich

उत्तर

1

तर्क आपके मॉडल (उत्पाद वर्ग) में जाने की आवश्यकता है। आपके मॉडल में IsDirty संपत्ति (क्षेत्र द्वारा समर्थित) का खुलासा करने के लिए एक साफ दृष्टिकोण होगा।

और आपके व्यू मॉडेल में CanSave के साथ आंतरिक संग्रह की जांच करने वाला कमांड होगा, और संग्रह में कोई आइटम IsDirty=true पर सत्य लौटाएगा।

0

मुझे लगता है कि आपके संग्रह में प्रत्येक ऑब्जेक्ट के लिए PropertyChanged ईवेंट की सदस्यता लेना और इस घटना को फायर करना, उदाहरण के लिए, आपकी ऑब्जेक्ट्स के सेटटर में काम कर सकते हैं।

हालांकि, मुझे लगता है कि आपको यह पता लगाने की आवश्यकता नहीं है कि आपके ग्रिड में कोई सेल बदल गया है या नहीं। मुझे लगता है कि तुम क्या वे यहाँ के बजाय कर की तरह कुछ कर सकते हैं:

http://social.msdn.microsoft.com/Forums/en/wpf/thread/81131225-90fb-40f9-a311-066952c7bc43

2

बस ObservableCollection का उपयोग करें। इसमें कलेक्शन चेंज नामक एक ईवेंट है। यदि आप इसे पंजीकृत करते हैं, तो आप जो भी चाहते हैं वह कर सकते हैं। उदाहरण:

ObservableCollection<string> strings = new ObservableCollection<string>(); 
strings.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(changed); 
strings.Add("Hello"); 
strings[0] = "HelloHello"; 

और:

private void changed(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args) 
{ 
    //You get notified here two times. 
} 
+24

एमएसडीएन दस्तावेज़ीकरण के बावजूद, संग्रह में ऑब्जेक्ट्स संग्रह के दौरान संग्रहChanged लागू नहीं होता है। केवल जब संग्राहक में वस्तुओं को जोड़ा या हटा दिया जाता है। –

9
  • हर प्रॉपर्टी के लिए अधिसूचना के साथ अपने Product कक्षा में INotifyPropertyChanged को लागू करें।
  • अपने व्यूमोडेल में INotifyPropertyChanged लागू करें।
  • संपत्ति IsDirty अपने ViewModel (अधिसूचना के साथ करने के लिए INotifyPropertyChanged के माध्यम से अपने viewmodel में CollectionChanged

    public YourViewModel() 
    { 
        ... 
        YourCollection.CollectionChanged += YourCollection_CollectionChanged; 
        ... 
    } 
    
    private void YourCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args) 
    { 
        if (args.OldItems != null) 
         foreach(var oldItem in args.OldItems) 
          oldItem.PropertyChanged -= YourItem_PropertyChanged; 
    
        if (args.NewItems != null) 
         foreach(var newItem in args.NewItems) 
          newItem.PropertyChanged += YourItem_PropertyChanged; 
    } 
    
    private void Youritem_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs args) 
    { 
        IsDirty = true; 
    } 
    
  • अब आप अपने viewmodel की IsDirty संपत्ति के लिए बाध्य कर सकते हैं, उदाहरण के लिए जोड़ें।

  • , सदस्यता, आप कर सकते हैं Button.IsEnabled संपत्ति सीधे इसे

+0

इसे उत्तर के रूप में सेट किया जाना चाहिए। – Oystein

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