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.
}
क्या आप कुछ कोड पोस्ट कर सकते हैं? – TalentTuner
+1 अच्छा सवाल है। मैंने थोड़ी देर के लिए डब्ल्यूपीएफ में कुछ भी नहीं किया है, लेकिन एक अलग भाषा में एक और ढांचे में समान अवधारणाएं हैं और रन लूप को रोककर, बड़ी संख्या में गुणों को बदलने और फिर रन लूप को रोककर इस समस्या को हल करती है। मैं कुछ इसी तरह की तलाश में हूं। –