2010-11-05 19 views
14

मुझे कभी-कभी लगता है कि मैं निर्भरता संपत्तियों का अनावश्यक रूप से उपयोग कर रहा हूं। मुझे इसका उपयोग करने की आवश्यकता कब होगी? जब मेरे पास ऐसी संपत्ति है जो अन्य गुणों पर निर्भर करती है? मान लें कि मेरे पास Color संपत्ति है जो मैं चाहता हूं कि यह गुणों पर निर्भर हो, ह्यू, संतृप्ति, चमकदारता क्या मैं निर्भरता संपत्ति का उपयोग करता हूं? या मैं क्या उपयोग करूं? गुणों को ह्यू, संतृप्ति, चमकदारता बदलते समय अपडेट करने के लिए मैं Color पर बाध्य करता हूं।निर्भरता गुणों का उपयोग कब करें

मैं अब क्या किया के लिए

public byte Hue { 
    get { return _hue; } 
    set 
    { 
     if (_hue == value) 
      return; 
     _hue = value; 
     NotifyPropertyChanged("Hue"); 
     NotifyPropertyChanged("Color"); // to update controls bound to color 
    } 
} 

था लेकिन मुझे लगता है यह काम करने के लिए सही रास्ता नहीं है? यदि मेरे पास रंग को प्रभावित करने वाले अधिक गुण हैं, तो मेरे पास उन सभी गुणों में 1 अतिरिक्त पंक्ति होगी?

+1

मुझे नहीं लगता कि कोड के संदर्भ में यह अनुचित ओवरहेड है, और यह निर्भरता प्रॉपर्टी जोड़ने से निश्चित रूप से अधिक हल्का वजन है। –

+0

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

उत्तर

21

आपको केवल DependencyProperty का उपयोग करना चाहिए जब आप को को XAML के माध्यम से कुछ करने के लिए बाध्य करने में सक्षम होना चाहते हैं, उदा।

<local:MyObject MyDependencyProperty="{Binding ...}" /> 

अद्यतन: नीचे के रूप में इयान द्वारा उल्लेख किया है, निर्भरता गुण भी अगर आप आप इस तरह से काम करने की जरूरत नहीं है, तो अपनी संपत्ति चेतन या एक शैली

के माध्यम से यह निर्धारित करने में सक्षम होना चाहता हूँ के लिए आवश्यक हैं तो यह अनावश्यक है। जैसे तुम सिर्फ XAML के माध्यम से एक निरंतर के लिए मूल्य निर्धारित करने में सक्षम होना चाहते हैं (नीचे के रूप में) यदि आप पर एक संपत्ति के मूल्य को बाध्य करने के लिए चाहते हैं यह एक DependencyProperty

<local:MyObject MyRegularProperty="Some Value" /> 

इसी तरह का उपयोग किए बिना काम करेंगे (उदाहरण के लिए) आपके विचार मॉडल:

<TextBlock Text="{Binding MyViewModelProperty}" /> 

तो आप एक DependencyProperty उपयोग करने की आवश्यकता नहीं है। बशर्ते कि आप INotifyPropertyChanged लागू करें, तो Text तब भी अपडेट हो जाएगा जब संपत्ति बदलती है।

संपादित करें: फिर से पढ़ने अपने प्रश्न, मुझे यकीन है कि नहीं या नहीं, अपनी स्थिति क्या है या नहीं आप का उपयोग एक DependencyProperty से प्रभावित हो जाएगा पर - अगर मैं इसे सही ढंग से पढ़ रहा हूँ, तुम सब करना चाहते है यूआई पर कई गुणों को अद्यतन करने का कारण बनता है जब उनमें से कोई भी गुण बदलता है, है ना?

मुझे नहीं लगता कि आप इस समय चीजों को कैसे कार्यान्वित कर रहे हैं, इस बारे में कुछ भी गलत है (यानी प्रत्येक सेटटर में PropertyChanged घटनाओं को बढ़ाकर), लेकिन यदि आप इसमें उत्सुक नहीं हैं तो आप एकल संपत्ति है कि प्रासंगिक बाल गुण को उजागर करता है कि करने के लिए बाध्य करने के लिए सभी गणना कर रहे हैं:

class ColorWrapper 
{ 
    public Color Color { get; set; } 
    public byte Hue 
    { 
     get { return this.Color.Hue; } //or however this is calculated 
} 

फिर उस PropertyChanged घटना को जन्म देती है अपने ViewModel पर एक Color संपत्ति है और दृश्य के माध्यम से है कि करने के लिए बाध्य:

<TextBlock Text="{Binding Color.Hue}" /> 

जैसा कि मैंने कहा, मैं यह नहीं कहूंगा कि यह विशेष रूप से आपके पास पहले से ही एक सुधार है।

+0

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

+0

@ इयान ग्रिफिथ्स, एनीमेशन और स्टाइल पर अच्छा बिंदु - उत्तर अपडेट किया गया। डिफ़ॉल्ट मानों पर आपकी टिप्पणी मान्य है, मुझे लगता है, लेकिन एक सादे संपत्ति पर एक निर्भरता संपत्ति को कार्यान्वित करने और उपयोग करने में शामिल ओवरहेड दिया गया है (विशेष रूप से यदि आप पहले से ही 'निर्भरता ऑब्जेक्ट' पर काम नहीं कर रहे हैं) तो मैं आमतौर पर उस मार्ग पर नहीं जाऊंगा। –

+4

डिफ़ॉल्ट मान चीज़ का डब्ल्यूपीएफ के प्रदर्शन पर एक गैर-मामूली प्रभाव पड़ता है। यह प्रति वस्तु कुछ सौ बाइट बचाता है, और यदि आपके दृश्य पेड़ में कुछ हज़ार वस्तुएं हैं, तो यह कई सौ केबी है। समग्र स्मृति का एक छोटा सा अंश, लेकिन कुशल CPU कैश उपयोग (लेआउट के दौरान esp) पर बड़े पैमाने पर प्रभाव के लिए पर्याप्त है। हालांकि, यह किसी भी गैर-यूआई ऑब्जेक्ट्स के लिए अप्रासंगिक होने की संभावना है, और शायद कस्टम यूआई तत्वों के लिए बहुत मदद नहीं है, जहां एक उच्च संभावना है कि आप जो भी क्यूसम गुण परिभाषित करेंगे, उसे सेट कर देंगे। तो मैं सहमत हूं ... मैं बस यह स्पष्ट करना चाहता था कि डीपी कई उद्देश्यों को पूरा करते हैं। –

15

सामान्य नियम हैं:

  • XAML नियंत्रण, उपयोग निर्भरता गुण के लिए;

  • डेटा के लिए (जो आप इंटरफ़ेस में बाध्य हैं), INotifyPropertyChanged का उपयोग करें।

अपवाद हैं, लेकिन वे दुर्लभ हैं।

0

याद रखें कि निर्भरता गुण, हालांकि वे किसी स्रोत या लक्ष्य के रूप में बाध्यकारी को अनुमति देते हैं, थ्रेड-सेंसिटिव भी हैं, और जब आपको क्रमबद्ध करना होगा तो सरोगेटिंग का उपयोग करना होगा, निर्भरता के रूप में क्रमिकता को क्रमबद्ध नहीं किया जा सकता है।

ओह, और बराबर और GetHashCode सिले हुए हैं :(

2

निर्भरता गुणों का एक अन्य प्रयोग नेविगेशन पत्रिका के साथ है। मेटा डेटा में Juornal ध्वज के साथ एक पृष्ठ पर कस्टम निर्भरता गुण राज्य में शामिल किए गए हैं कि WPF बचाता है पृष्ठ के लिए।

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