2012-02-23 14 views
6

मेरी परियोजना में मेरे पास एक मॉडल है और मैं मॉडल गुणों में से किसी एक का उपयोग कर लेबल की दृश्य स्थिति को बांधना चाहता हूं। मैं मॉडल में एक और शोलेबेल संपत्ति नहीं जोड़ना चाहता हूं। मैं कुछ इस तरह लिखने के लिए सक्षम होना चाहते हैं:.net WinForms डेटा संपत्ति के बजाय Lambda का उपयोग कर बाध्यकारी

label.Bindings.Add("Visible", model, m => m.Name != "Default"); 

मूल रूप से मैं अपने मॉडल के लिए एक संपत्ति जोड़ने के बजाय एक लैम्ब्डा अभिव्यक्ति लिखने में सक्षम होना चाहता हूँ। क्या यह संभव है?

उत्तर

2

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

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

बेशक, यदि आप करते हैं तो संभवत: उस रैपर पर लागू होने वाली किसी भी संपत्ति को लागू करने के लिए यह संभवतः आसान है।

सामान्य रूप से डेटाबेस के साथ, आप सीधे कुछ अंतर्निहित मॉडल को बाध्यकारी से बचना चाहते हैं, ठीक है क्योंकि आप यूआई के लाभ के लिए पूरी तरह से अपने मॉडल में चीज़ें जोड़ना नहीं चाहते हैं। यही कारण है कि 'अलग प्रस्तुति' बहुत लोकप्रिय है - मॉडल को जोड़ने और सीधे देखने के बजाय, आप उस मध्य में कुछ चिपकते हैं जिसका काम मध्यस्थता करना है। कुछ इसे एक व्यूमोडेल कहते हैं, कुछ इसे प्रस्तुतकर्ता कहते हैं, लेकिन बुनियादी सिद्धांत हमेशा प्रेजेंटेशन को अलग करता है।

ऐसा लगता है कि आप प्रस्तुति के अलग-अलग (जो अच्छा है) प्राप्त करने की कोशिश कर रहे हैं लेकिन अतिरिक्त प्रकार के परिचय के बिना ताकि यह मध्यम परत कहीं और जा सके। उस परत के रूप में कार्य करने के लिए केवल कक्षा (या कक्षाओं का एक सेट) परिभाषित क्यों न करें?

4

हां, आप बाइंडिंग क्लास के Format ईवेंट का उपयोग करके ऐसा कर सकते हैं। आप अभी भी प्रश्न में संपत्ति से जुड़ जाएंगे, लेकिन आपका प्रारूप ईवेंट हैंडलर एक अलग मूल्य (इस मामले में एक बूल) वापस कर देगा।

var binding = new Binding("Visible", model, "Name"); 
binding.Format += (sender, args) => args.Value = (string)args.Value != "Default"; 
label.DataBindings.Add(binding); 
+0

पूरी तरह से काम करता है। मैं ऐसा करने के लिए एक छोटी पुस्तकालय लिखने के बारे में सोच रहा था, लेकिन इस कोड को एक विधि में फेंकने की ज़रूरत है। धन्यवाद! –