2010-05-19 23 views
5

मेरे पास मेरी कक्षा है जिसमें एक आंतरिक अवलोकन संग्रह है। मैं इस में डेटा को किसी फ़ंक्शन के माध्यम से कक्षा के उपयोगकर्ता को पास करना चाहता हूं।केवल देखने योग्य संग्रह पढ़ें

मैं नहीं चाहता कि वे अवलोकन संग्रह या संग्रह के अंदर वस्तुओं को बदलने में सक्षम हों।

इस प्रदर्शन और उपयोग के तरीके को आसान बनाने का सबसे अच्छा तरीका क्या है?

उत्तर

5

शायद इसका उपयोग कर: ReadOnlyObservableCollection<T>। ध्यान दें कि आपको अपनी ऑब्जेक्ट्स के लिए अपने स्वयं के केवल पढ़ने वाले रैपर लिखना होगा, क्योंकि ReadOnlyObservableCollection<T> केवल संग्रह के अपडेट को रोकता है।

1

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

+0

में आपका स्वागत है:

यहाँ मैं क्या उपयोग है कि covarience के लिए अनुमति देता है। कृपया समझने में आसान बनाने की कोशिश करें - उदा। स्वरूपण (कोड, पृथक पैराग्राफ या सूची शैलियों) द्वारा। शायद एक उदाहरण मदद करेगा? – Mateng

1

मुझे ReadOnlyObservableCollection<T> का उपयोग करना पसंद नहीं है क्योंकि यह एक गलती/टूटी हुई कक्षा की तरह लगता है; मैं इसके बजाय एक अनुबंध आधारित दृष्टिकोण पसंद करते हैं। अपने पहले जवाब देने के लिए Stackoverflow और बधाई के लिए

public interface INotifyCollection<T> : ICollection<T>, INotifyCollectionChanged 
{ 
} 

public interface IReadOnlyNotifyCollection<out T> : IReadOnlyCollection<T>, INotifyCollectionChanged 
{ 
} 

public class NotifyCollection<T> : ObservableCollection<T>, INotifyCollection<T>, IReadOnlyNotifyCollection<T> 
{ 
} 

public class Program 
{ 
    private static void Main(string[] args) 
    { 
     var full = new NotifyCollection<string>(); 
     var readOnlyAccess = (IReadOnlyCollection<string>) full; 
     var readOnlyNotifyOfChange1 = (IReadOnlyNotifyCollection<string>) full; 

     //Covarience 
     var readOnlyListWithChanges = new List<IReadOnlyNotifyCollection<object>>() 
      { 
       new NotifyCollection<object>(), 
       new NotifyCollection<string>(), 
      }; 
    } 
} 
संबंधित मुद्दे