2010-11-29 12 views
8

WPF डाटाबेसिंग का उपयोग करते समय, मैं स्पष्ट रूप से MyCollection = new CollectionType<Whatever>(WhateverQuery()); के साथ कुछ नहीं कर सकता क्योंकि बाइंडिंग पुराने संग्रह का संदर्भ है। मेरा कामकाज अब तक MyCollection.Clear(); रहा है जिसके बाद MyCollection.Add(item); कर रहा है - जो प्रदर्शन और सौंदर्यशास्त्र दोनों के लिए बहुत खराब है।डब्ल्यूपीएफ: बिना साफ़ किए गए डाटाबेस संग्रह सामग्री को बदलें/

ICollectionView, हालांकि बहुत साफ, समस्या को हल नहीं करता है क्योंकि यह SourceCollection संपत्ति केवल पढ़ने योग्य है; बमर, क्योंकि यह एक अच्छा और आसान समाधान होता।

अन्य लोग इस समस्या को कैसे संभालने में हैं? यह उल्लेख किया जाना चाहिए कि मैं एमवीवीएम कर रहा हूं और इस प्रकार व्यक्तिगत नियंत्रण बाइंडिंग के माध्यम से rummage नहीं कर सकता। मुझे लगता है कि मैं ObservableCollection के आसपास एक रैपर बना सकता हूं ReplaceSourceCollection() विधि खेल रहा है, लेकिन उस मार्ग पर जाने से पहले मैं जानना चाहता हूं कि कुछ और सर्वोत्तम अभ्यास है या नहीं।

संपादित करें:

WinForms के लिए, मैं एक BindingSource के खिलाफ नियंत्रण के लिए बाध्य हैं मुझे बस यह DataSource संपत्ति है अद्यतन करें और ResetBindings() विधि कॉल करने के लिए अनुमति देता है, - प्रेस्टो अंतर्निहित संग्रह कुशलता से बदल दिया है। मैं बॉक्स के बाहर एक समान परिदृश्य का समर्थन करने के लिए डब्ल्यूपीएफ डाटाबेसिंग की उम्मीद करता?

उदाहरण (छद्म-आईएसएच) कोड: डब्ल्यूपीएफ नियंत्रण (लिस्टबॉक्स, डेटाग्रिड, जो भी आप कल्पना करते हैं) Users संपत्ति से जुड़ा हुआ है। मुझे लगता है कि संग्रह केवल पढ़ने के लिए किया जाना चाहिए समस्याओं ReloadUsersBad() द्वारा प्रदर्शन से बचने के लिए, लेकिन फिर इस उदाहरण के लिए बुरा कोड स्पष्ट रूप से संकलित नहीं होता :)

public class UserEditorViewModel 
{ 
    public ObservableCollection<UserViewModel> Users { get; set; } 

    public IEnumerable<UserViewModel> LoadUsersFromWhateverSource() { /* ... */ } 

    public void ReloadUsersBad() 
    { 
     // bad: the collection is updated, but the WPF control is bound to the old reference. 
     Users = new ObservableCollection<User>(LoadUsersFromWhateverSource()); 
    } 

    public void ReloadUsersWorksButIsInefficient() 
    { 
     // works: collection object is kept, and items are replaced; inefficient, though. 
     Users.Clear(); 
     foreach(var user in LoadUsersFromWhateverSource()) 
      Users.Add(user); 
    } 

    // ...whatever other stuff. 
} 
+0

क्या आप कुछ कोड पोस्ट कर सकते हैं? – TalentTuner

+0

+1 अच्छा सवाल है। मैंने थोड़ी देर के लिए डब्ल्यूपीएफ में कुछ भी नहीं किया है, लेकिन एक अलग भाषा में एक और ढांचे में समान अवधारणाएं हैं और रन लूप को रोककर, बड़ी संख्या में गुणों को बदलने और फिर रन लूप को रोककर इस समस्या को हल करती है। मैं कुछ इसी तरह की तलाश में हूं। –

उत्तर

4

यदि ऑब्जेक्ट MyCollectionINotifyPropertyChanged लागू करता है, तो आप संग्रह को आसानी से बदल सकते हैं।

एक उदाहरण:

public class MyClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private ObservableCollection<Whatever> _myCollection; 

    private void NotifyChanged(string property) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 

    public ObservableCollection<Whatever> MyCollection 
    { 
     get 
     { 
      return _myCollection; 
     } 
     set 
     { 
      if (!ReferenceEquals(_myCollection, value)) 
      { 
       _myCollection = value; 
       NotifyChanged("MyCollection"); 
      } 
     } 
    } 
} 
इस के साथ

, जब आप एक संग्रह असाइन करते हैं, WPF इस का पता लगाता है और सब कुछ अपडेट किया जाता है।

इस तरह मैं इसे हल करूँगा।

+0

बेशक ... मुझे पूरा यकीन है कि मुझे पहले भी ऐसा करना है। –

+0

डी ओह!यह कुछ आसान और स्पष्ट होना था, है ना? : पी – snemarch

+0

कोई समस्या नहीं, खुशी है कि मैं मदद कर सकता हूं। –

1

नीचे दिए गए लिंक एक AddRange विधि को लागू करने का तरीका बताता है।

http://blogs.msdn.com/b/nathannesbit/archive/2009/04/20/addrange-and-observablecollection.aspx

ऐसा लगता है कि आप एक उप-वर्ग है कि इस मामले को सही ढंग से हैंडल को लागू करने के साथ फंस रहे हैं।

जाहिर है, कुछ नियंत्रण बैच संग्रह परिवर्तन अधिसूचनाओं का समर्थन नहीं करते हैं। कम से कम उन्होंने तब नहीं लिखा जब वह लेख लिखा गया था। यदि आप आगे की जांच करना चाहते हैं तो अब आपके पास थोड़ी अधिक जानकारी होनी चाहिए।

+0

बैच किए गए अपडेट से निपटने के लिए मूल लेख (जैसा कि पूरी तरह से प्रतिस्थापित करने के विपरीत है) - बुरा है कि 'ListCollectionView' केवल एकल आइटम अपडेट का समर्थन करता है: | – snemarch

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