2010-03-18 11 views
8

मैं अभी भी डायनामिक ऑब्जेक्ट्स के साथ प्रयोग कर रहा हूं। अब मुझे कुछ जानकारी चाहिए: मैं डायनामिक ऑब्जेक्ट से एक WPF डेटाग्रिड (सिल्वरलाइट नहीं) तक विरासत में प्राप्त ऑब्जेक्ट को बांधने की कोशिश कर रहा हूं।स्वचालित कॉलम पीढ़ी के साथ डेटाग्रिड को बाध्यकारी डायनामिक ऑब्जेक्ट?

मैं डेटाग्रिड को स्वचालित रूप से रनटाइम पर उत्पन्न ऑब्जेक्ट के उपलब्ध सार्वजनिक गुणों से अपने कॉलम कैसे प्राप्त करूं? क्या यह वास्तव में संभव है?

उत्तर

10

गतिशील गुणों की क्वेरी करने के लिए कोई समान तरीका नहीं है, आम तौर पर यह अपेक्षा की जाती है कि आप उन्हें समय से पहले जानते हैं। DynamicObject के साथ, कार्यान्वयन GetMemberNames ओवरराइड कर सकते हैं और यह आम तौर पर आपको गुण देता है, हालांकि यह वास्तव में डिबगिंग के लिए है क्योंकि इसकी आवश्यकता नहीं है कि यह सभी गुण प्रदान करे। अन्यथा यदि यह आपका DynamicObject है तो आपको अपने गतिशील कार्यान्वयन के आधार पर गुण प्राप्त करने के लिए बस अपनी खुद की विधि लिखनी होगी। उदाहरण के लिए ExpandoObject आपको IDictionary इंटरफ़ेस का उपयोग करके सभी संपत्तियों से पूछताछ करने देता है।

तो एक बार जब आपके पास अपनी संपत्तियां प्राप्त करने का कोई तरीका हो तो आपको डेटाग्रिड को बताना होगा। दुर्भाग्य से डेटाग्रिड के साथ, डेटाग्रिड को आपके गुणों के बारे में बताने के लिए ICustomTypeDescriptor को कार्यान्वित करने के साथ समस्या यह है कि डेटाग्रिड टाइप टाइपस्क्रिप्टर्स को टाइप नहीं करता है, जो डायनामिक ऑब्जेक्ट्स की समस्या है, हालांकि डायनेमिक ऑब्जेक्ट्स के संग्रह पर ITypedList को कार्यान्वित करना होगा यदि आप अपने संग्रह पर गैर-जेनेरिक IList इंटरफ़ेस को लागू नहीं करते हैं, तो बहुत छोटा गॉचा, इसे उस बिंदु पर पहुंचने से पहले बाहर कर दिया जाएगा जहां यह ITypeList के लिए जांच करता है।

तो संक्षेप में, ITypedList और IList के साथ संग्रह को कार्यान्वित करें। ITypedListGetListName के लिए वापसी शून्य के साथ और बस GetItemProperties(PropertyDescriptor[] listAccessors) लागू करें; listAccessors को अनदेखा करें और अपनी सूची में सर्वोत्तम प्रतिनिधित्व किए गए डायनामिक ऑब्जेक्ट उदाहरण के आधार पर नामित प्रत्येक सदस्य के लिए PropertyDescriptors का एक PropertyDescriptorCollection लौटाएं (सबसे अधिक संभावना केवल पहली वस्तु)। आप PropertyDescriptor का एक उपवर्ग को लागू करने की क्या ज़रूरत है, प्राप्त/सेट मूल्य के लिए एक आसान और सामान्य तरीके से खुला स्रोत ढांचे Dynamitey

using System; 
using System.ComponentModel; 
using Dynamitey; 
public class DynamicPropertyDescriptor:PropertyDescriptor 
{ 
     public DynamicPropertyDescriptor(string name) : base(name, null) 
     { 
     } 

     public override bool CanResetValue(object component) 
     { 
      return false; 
     } 

     public override object GetValue(object component) 
     { 
      return Dynamic.InvokeGet(component, Name); 
     } 

     public override void ResetValue(object component) 
     { 

     } 

     public override void SetValue(object component, object value) 
     { 
      Dynamic.InvokeSet(component, Name, value); 
     } 

     public override bool ShouldSerializeValue(object component) 
     { 
      return false; 
     } 

     public override Type ComponentType 
     { 
      get { return typeof(object); } 
     } 

     public override bool IsReadOnly 
     { 
      get { return false; } 
     } 

     public override Type PropertyType 
     { 
      get 
      { 
       return typeof (object); 
      } 
     } 
} 
+0

यह Winforms में भी काम करता है। आपका बहुत बहुत धन्यवाद! – swe

2

मुझे लगता है कि DataGrid ऑब्जेक्ट गुणों को कॉलम बनाने के लिए TypeDescriptor का उपयोग करता है। इसलिए यदि आप DynamicObject लागू ICustomTypeDescriptor लागू करते हैं तो आपको इसे प्राप्त करने में सक्षम होना चाहिए। GetProperties विधि को लागू करें ताकि यह आपके ऑब्जेक्ट की गतिशील गुणों को लौटा सके।

+0

यह किसी भी मामले में सिल्वरलाइट साथ जाने के लिए रास्ता नहीं है, के रूप में SL 'नहीं करता है का उपयोग करना है टी 'ITypedList' है। – McGarnagle