2011-09-15 10 views
5

मैं एक WPF उपयोगकर्ता नियंत्रण बना रहा हूं और मैं बाध्यकारी के अर्थ में डेटाग्रिड नियंत्रण के समान व्यवहार चाहता हूं। मेरा सवाल यह है कि: डेटाग्रिड कैसे जानता है कि किसी भी प्रकार के संग्रह को आईएनयूमेरेबल से कैसे बांधना है? उदाहरण के लिए: आप डेटाव्यू को आइटमसोर्स के रूप में पास कर सकते हैं, और आप किसी ऑब्जेक्ट संग्रह को भी पास कर सकते हैं।डेटाग्रिड किसी संग्रह के गुणों से कैसे जुड़ता है?

<DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn**}"/> 

अग्रिम धन्यवाद: कैसे डेटा ग्रिड केवल इस को देखकर DataView के एक स्तंभ, या वस्तु की एक संपत्ति के लिए करने के लिए बाध्य करने के लिए कि क्या निर्णय लेता है।

+0

इस http: // stackoverflow को जांचें।कॉम/प्रश्न/5488014/इन-डब्ल्यूपीएफ-हैं-बाध्यकारी-पथ-और-बाध्यकारी-वास्तव में बराबर, http://stackoverflow.com/questions/3504480/when-to-use-path-in-wpf- बाइंडिंग और http://stackoverflow.com/questions/4742449/new-to-wpf-data- बाइंडिंग –

+0

@ संदीप जीबी यह मेरा प्रश्न नहीं था। मुझे पता है कि बाध्यकारी कैसे करें, मैं जानना चाहता हूं कि डेटाग्रिड किसी ऑब्जेक्ट के साथ आंतरिक रूप से कैसे करता है। – Vale

उत्तर

3

यह एक जटिल क्षेत्र है; निम्नलिखित Winforms बाध्यकारी से एक टूटना है, लेकिन मैं समझता हूं कि डब्ल्यूपीएफ बाध्यकारी अलग नहीं है;

  • एक वस्तु को देखते हुए, पहली बात यह है बाध्यकारी कोड क्या करेंगे IListSource के लिए देखो है - और यदि ऐसा है तो GetList() का उपयोग वास्तविक बाध्यकारी प्राप्त करने के लिए (यह कैसे एक डेटा तालिका बाध्यकारी प्रयोजनों के लिए एक डेटा-व्यू हो जाता है)
  • उसके बाद, स्रोत आमतौर पर ITypedList के लिए चेक किया जाता है; यह मॉडल द्वारा प्रतिनिधित्व छद्म गुणों (GetItemProperties()) प्राप्त करने का एक लचीला तरीका है; डेटा-व्यू ITypedList लागू करता
  • अन्यथा उदाहरण प्रति छद्म गुण बनाने, यह डेटा के लिए एक स्पष्ट प्रकार है, जो हो सकता है की पहचान करना संभव हो सकता है:
    • रूप public SomeType this[int index] {get;} का एक इंडेक्सर की तलाश में - ध्यान दें कि सबसे अगर वस्तु (यदि हो तो) sorce से उन इंटरफेस
    • पहली वस्तु लेने को लागू करता है संग्रह इस
    • को पूरा करेगा (WinForms द्वारा नहीं किया है, लेकिन WPF के लिए हो सकता है) प्रतिबिंब के माध्यम से हल करने या तो IList<T> या IEnumerable<T> में T, और GetType()
    • का उपयोग कर
  • एक बार एक प्रकार ज्ञात हो जाने पर, TypeDescriptor.GetProperties(type) गुण प्राप्त करने के लिए उपयोग किया जा सकता है; कई मामलों में यह प्रतिबिंब के माध्यम से होगा, लेकिन एक प्रकार के गुणों की आपूर्ति के लिए एक संकेतक परत (TypeDescriptionProvider के माध्यम से) को जोड़ना भी संभव है (इसे रनटाइम पर जोड़ा जा सकता है, जो बहुत सुविधाजनक हो सकता है)
  • के मामले में व्यक्तिगत बाध्यकारी (बाध्यकारी सूची नहीं), TypeDescriptor.GetProperties(obj) भी है - प्रतिबिंब और TypeDescriptionProvider के अलावा, इसमें ICustomTypeDescriptor के लिए भी समर्थन है जिसे रनटाइम पर कस्टम गुणों की आपूर्ति करने के लिए एक व्यक्तिगत ऑब्जेक्ट द्वारा कार्यान्वित किया जा सकता है (TypeDescriptionProvider के समान, लेकिन व्यक्ति के साथ गुणों के लिए जिम्मेदारी लेना वस्तु)

मुझे नहीं पता कि यह कितना डब्ल्यूपीएफ बाध्यकारी पर लागू होता है, लेकिन मुझे पूरा यकीन है कि IListSource और ITypedList प्रसंस्करण समान है। स्मृति से, Winforms रणनीतियों के अधिकांश (सभी?) WPF पर काम करेंगे - इसलिए यह हो सकता है और परिवर्तन अतिरिक्त हुक हैं।

+0

धन्यवाद, आपके उत्तर ने मुझे यह विचार दिया कि मेरी समस्या का समाधान कैसे करें। – Vale

0

मुझे लगता है कि:

आप अपने Collection के तत्व की Type प्राप्त कर सकते हैं, इस प्रकार TypeGetProperties() विधि है, जो अपने प्रकार के सभी सार्वजनिक संपत्तियों उपलब्ध रिटर्न है, और, अपने सभी सार्वजनिक संपत्तियों को पता है के बाद, यह उनके साथ बांध सकता है।

+0

हां, लेकिन यह DataView के साथ कैसे काम करता है? यह DataRowView ऑब्जेक्ट्स का संग्रह है, और उन ऑब्जेक्ट्स में कॉलम प्रॉपर्टी नहीं है, और वे अभी भी कॉलम से बंधे हैं। – Vale

+0

मुझे लगता है कि इस आलेख को [MSDN] (http://msdn.microsoft.com/en-US/library/bb669099 (v = VS.100) .aspx) की सहायता करनी चाहिए। फ़ील्ड (स्ट्रिंग) - क्या आप इसे खोज सकते हैं? – stukselbax

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