2009-06-26 15 views
5

में उपयोग करती है मुझे निर्भरता संपत्ति के अच्छे कारणों का पता लगाने में कठिनाई हो रही है। System.Controls.TextBox "टेक्स्ट" संपत्ति एक निर्भरता संपत्ति क्यों नहीं है और सामान्य संपत्ति नहीं है? निर्भरता संपत्ति होने पर यह क्या लाभ प्रदान करता है?निर्भरता संपत्ति WPF

उन चीजों में से एक जो मैं पूरा करने की कोशिश कर रहा हूं वह है मेरे उपयोगकर्ता नियंत्रण में एक सत्यापन नियम संपत्ति को जोड़ना जिसमें अन्य सत्यापन नियम शामिल होंगे। यहाँ की तरह:

<customControls:RequiredTextBox.ValidationRules> 
         <validators:NotNullOrEmptyValidationRule ErrorMessage="FirstName cannot be null or empty"/> 
        </customControls:RequiredTextBox.ValidationRules> 

समस्या यह है कि मुझे यकीन है कि अगर ValidationRules संपत्ति DependencyProperty या सिर्फ एक सामान्य संपत्ति होना चाहिए नहीं कर रहा हूँ है।

ऊपर कोड निम्न त्रुटि देता है:

{"Cannot add element to 'ValidationRules'; the property value is null. Error at object 'LearningWPF.ValidationRules.NotNullOrEmptyValidationRule' in markup file 'LearningWPF;component/addcustomerwindow.xaml' Line 35 Position 66."} 

यहाँ ValidationRules संपत्ति है:

public static readonly DependencyProperty ValidationRulesProperty = 
      DependencyProperty.Register("ValidationRules", 
             typeof (Collection<ValidationRule>), typeof (RequiredTextBox), 
             new FrameworkPropertyMetadata(null)); 

     public Collection<ValidationRule> ValidationRules 
     { 
      get { return (Collection<ValidationRule>)GetValue(ValidationRulesProperty); } 
      set { SetValue(ValidationRulesProperty, value); } 
     } 
+0

प्रमाणीकरण नियम किस प्रकार का है? ऐसा लगता है कि आप ऑब्जेक्ट को संग्रह प्रकार में जोड़ने का प्रयास कर रहे हैं, लेकिन संग्रह को तुरंत चालू नहीं किया है। –

+0

मैंने पोस्ट अपडेट किया! – azamsharp

+0

इससे पहले कि आप इसमें आइटम जोड़ सकें, आपको संग्रह को तुरंत चालू करने की आवश्यकता है। आपके RequiredTextBox क्लास के कन्स्ट्रक्टर में जोड़ें: ValidationRules = नया संग्रह <प्रमाणीकरण नियम>(); अब आप xmal के माध्यम से इसमें आइटम जोड़ सकेंगे। –

उत्तर

8

लाभ हैं मुख्य रूप से दो गुना:

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

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


अपने संशोधित प्रश्न में उदाहरण संबोधित करने के लिए संपादित:

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

बस शब्दों में कहें, जबकि निर्भरता संपत्ति परिभाषित करने के लिए अधिक जटिल है कि एक सामान्य संपत्ति मैं अभी भी इसे WPF नियंत्रणों के लिए वास्तविक तथ्य के रूप में उपयोग करूँगा जब तक अन्यथा ऐसा करने का कोई अच्छा कारण न हो। एक संपत्ति के रूप में वैसे ही कक्षाओं के लिए मानक है, भले ही एक क्षेत्र को लागू करना आसान हो।

+0

अद्यतन पोस्ट देखें! – azamsharp

+0

क्या आप दो निर्भरता गुणों को सूचीबद्ध कर सकते हैं जो आपके कस्टम नियंत्रण में होंगे ताकि मेरे पास बेहतर विचार हो? – azamsharp

2

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

5

प्राथमिक लाभों मैं कहूंगा कि इस प्रकार हैं:

  1. प्रथम श्रेणी डेटा बाइंडिंग समर्थन करते हैं।
  2. स्वच्छ संलग्न संपत्ति अर्थशास्त्र
  3. संपत्ति मूल्य जो "निर्भर" हैं।

अंतिम बिंदु है कुंजी

निर्भरता गुण से पहले, एक मूल्य होने एक स्थानीय मूल्य, एक animatable मूल्य, एक overridable मूल्य, एक Styleable मूल्य, एक templatable मूल्य से अधिक की घोषणा की आवश्यकता होगी है गुण/फ़ील्ड/शब्दकोश प्रविष्टियां, साथ ही जटिल स्थिति + प्राथमिकता प्रबंधन।

निर्भरता गुण आपको केवल एक संपत्ति घोषित करते समय बॉक्स के बाहर इन सभी सुविधाओं को देते हैं।

कहा जा रहा है कि, आपके मामले में, यदि आप इन सुविधाओं का लाभ उठाने की आवश्यकता नहीं है तो आप अपने सत्यापन नियमों को निर्भरता प्रॉपर्टी के रूप में घोषित नहीं करना चाहेंगे।

यदि आप करते हैं, तो आप अपने संग्रह (उदाहरण के लिए खाली संग्रह) के लिए अलग-अलग हैंडलिंग करना चाहते हैं। इस विशेष उदाहरण में, मैं प्रतिबिंबक का उपयोग करता हूं और देखता हूं कि .NET टेक्स्टबॉक्स उनके सत्यापन संग्रह को कैसे लागू करता है, और देखें कि क्या आप कोड का पुन: उपयोग या प्रतिलिपि बना सकते हैं।

जब तक आप निश्चित नहीं हैं तो आपका पहिया बेहतर होगा। मेरा व्यक्तिगत अनुभव यह है कि मेरे पुनर्निर्मित पहियों में चीजें गायब होती हैं;)।

जैसा कि मार्टिन हैरिस ने पहले से ही बताया है, निर्भरता प्रॉपर्टीज संपत्ति मूल्यों को एक शब्दकोश में फेंक कर मेमोरी पदचिह्न को सीमित कर सकती है, हालांकि यह निर्भरता प्रॉपर्टीज के आगमन से पहले एमएसएफटी द्वारा किया जा सकता है (और मुझे विश्वास है?)।

मार्टिन संलग्न गुणों का भी उल्लेख करता है, लेकिन वे निर्भरता प्रॉपर्टीज के आगमन से पहले (कम से कम डिजाइनर में) उपलब्ध थे। निर्भरता प्रॉपर्टीज का उपयोग करके संलग्न संपत्ति कार्यान्वयन बहुत साफ है।

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