खोज…
परिचय
निर्भरता गुण एक प्रकार की संपत्ति है जो सीएलआर संपत्ति का विस्तार करती है। जबकि सीएलआर संपत्ति को आपकी कक्षा के किसी सदस्य से सीधे पढ़ा जाता है, गेटवे () पद्धति को कॉल करते समय एक डिपेंडेंसी प्रॉपर्टी को गतिशील रूप से हल किया जाएगा जो कि बेस डिपेंडेंसीऑबजेक्ट क्लास से विरासत के माध्यम से आपकी वस्तु प्राप्त करता है।
यह सेक्शन डिपेंडेंसी प्रॉपर्टीज़ को तोड़ देगा और कॉन्सेप्ट और कोड उदाहरण दोनों के उपयोग के बारे में बताएगा।
वाक्य - विन्यास
- डिपेंडेंसीप्रोपरेट्री। रैगर (स्ट्रिंग नाम, टाइप प्रॉपर्टी टाइप, ओनर टाइप टाइप करें)
- डिपेंडेंसीप्रोपरेट्री। रैगर (स्ट्रिंग नाम, टाइप प्रॉपर्टी टाइप, टाइप ओनर टाइप, प्रॉपर्टीमेटटा टाइपमैटाटाटा)
- DependencyProperty.Register (स्ट्रिंग नाम, टाइप प्रॉपर्टी टाइप, टाइप ओनर टाइप, प्रॉपर्टीमैटाटा टाइपमैडेटा, वैलिडेटवैल्यू कॉलबैक वैलिडेटवैलकॉलबैक)
- DependencyProperty.RegisterAttached (स्ट्रिंग नाम, प्रकार गुण टाइप, स्वामी टाइप करें)
- डिपेंडेंसीप्रॉपरेटी। रैगरएस्टेड (स्ट्रिंग नाम, टाइप प्रॉपर्टी टाइप, टाइप ओनर टाइप, प्रॉपर्टीमैटाटा टाइपमैडेटाटा)
- DependencyProperty.RegisterAttached (स्ट्रिंग नाम, टाइप प्रॉपर्टी टाइप, टाइप ओनर टाइप, प्रॉपर्टीमैटाटा टाइपमैडेटा, वैलिडेटवैल्यू कॉलबैक वैलिडेटवैलकॉलबैक)
- डिपेंडेंसीप्रोपरेटी। रैगरिस्टरऑनली (स्ट्रिंग नाम, टाइप प्रॉपर्टी टाइप, टाइप ओनर टाइप, प्रॉपर्टीमैटाटा टाइपमैटाटा)
- DependencyProperty.RegisterReadOnly (स्ट्रिंग नाम, टाइप प्रॉपर्टी टाइप, टाइप ओनरटाइप, प्रॉपर्टीमैटाटा टाइपमैडेटा, वैलिडेटवैल्यू कॉलबैक वैलिडेटवैलबैक)
- डिपेंडेंसीप्रोपरेट्री। रैगरिस्टरएटेड रीडऑनली (स्ट्रिंग नाम, टाइप प्रॉपर्टी टाइप, ओनरशिप टाइप करें, प्रॉपर्टीमेटटा टाइपमैडेटाटा)
- DependencyProperty.RegisterAttachedReadOnly (स्ट्रिंग नाम, टाइप प्रॉपर्टी टाइप, टाइप ओनर टाइप, प्रॉपर्टीमैटाटा टाइपमैडेटा, वैलिडेटवैल्यू कॉलबैक वैलिडेटवैकलबैक)
पैरामीटर
पैरामीटर | विवरण |
---|---|
नाम | संपत्ति के नाम का String प्रतिनिधित्व |
संपत्ति के प्रकार | संपत्ति का Type , उदाहरण के लिए typeof(int) |
ownerType | Type वर्ग है, जिसमें संपत्ति परिभाषित किया जा रहा है, जैसे की typeof(MyControl) या typeof(MyAttachedProperties) । |
typeMetadata | सिस्टम का उदाहरण। System.Windows.PropertyMetadata (या इसके उपवर्गों में से एक) जो डिफ़ॉल्ट मानों को परिभाषित करता है, गुण परिवर्तित कॉलबैक, FrameworkPropertyMetadata System.Windows.Data.BindingMode.TwoWay जैसे बाध्यकारी विकल्पों को परिभाषित करने की अनुमति देता है। |
validateValueCallback | कस्टम कॉलबैक जो सही लौटाता है अगर संपत्ति का नया मूल्य वैध है, अन्यथा गलत है। |
मानक निर्भरता गुण
कब इस्तेमाल करें
वस्तुतः सभी WPF नियंत्रण निर्भरता गुणों का भारी उपयोग करते हैं। एक निर्भरता संपत्ति कई WPF सुविधाओं के उपयोग की अनुमति देती है जो अकेले मानक सीएलआर गुणों के साथ संभव नहीं हैं, जिसमें स्टाइल, एनिमेशन, डेटा बाइंडिंग, वैल्यू इनहेरिटेंस, और नोटिफिकेशन बदलने के लिए समर्थन तक सीमित नहीं है।
TextBox.Text
संपत्ति एक मानक निर्भरता संपत्ति की जरूरत है, जहां का एक सरल उदाहरण है। यदि Text
एक मानक सीएलआर संपत्ति थी, तो यहां डेटा बाइंडिंग संभव नहीं होगी।
<TextBox Text="{Binding FirstName}" />
कैसे परिभाषित करें
निर्भरता गुणों को केवल DependencyObject
से प्राप्त वर्गों में परिभाषित किया जा सकता है, जैसे कि FrameworkElement
, Control
, आदि।
सिंटैक्स को याद किए बिना एक मानक निर्भरता संपत्ति बनाने के लिए सबसे तेज़ तरीकों में से एक है, प्रोपड टाइप propdp
और फिर टैब दबाकर "प्रॉपप" स्निपेट का उपयोग करना। एक कोड स्निपेट डाला जाएगा जो तब आपकी आवश्यकताओं के अनुरूप संशोधित किया जा सकता है:
public class MyControl : Control
{
public int MyProperty
{
get { return (int)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}
// Using a DependencyProperty as the backing store for MyProperty.
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(int), typeof(MyControl),
new PropertyMetadata(0));
}
आपको संपत्ति के नाम, संपत्ति के प्रकार, वर्ग प्रकार और डिफ़ॉल्ट मान को अपडेट करने सहित आवश्यक परिवर्तन करने के लिए कोड स्निपेट के विभिन्न हिस्सों के माध्यम से टैब करना चाहिए।
महत्वपूर्ण सम्मेलन
यहां पालन करने के लिए कुछ महत्वपूर्ण सम्मेलन / नियम हैं:
निर्भरता संपत्ति के लिए एक CLR संपत्ति बनाएँ। यह संपत्ति आपके ऑब्जेक्ट के कोड-पीछे या अन्य उपभोक्ताओं द्वारा उपयोग की जाती है। यह आह्वान चाहिए
GetValue
औरSetValue
इसलिए उपभोक्ताओं की जरूरत नहीं है।निर्भरता संपत्ति को सही ढंग से नाम दें।
DependencyProperty
फ़ील्ड कोpublic static readonly
होना चाहिए। इसमें एक नाम होना चाहिए जो सीएलआर संपत्ति के नाम के साथ मेल खाता है और "संपत्ति", जैसेText
औरTextProperty
साथ समाप्त होता है।सीएलआर संपत्ति के सेटर में अतिरिक्त तर्क न जोड़ें। निर्भरता संपत्ति प्रणाली (और विशेष रूप से XAML) सीएलआर संपत्ति का उपयोग नहीं करती है। यदि आप संपत्ति के मूल्य में परिवर्तन करने के लिए कोई क्रिया करना चाहते हैं, तो आपको
PropertyMetadata
माध्यम से कॉलबैक प्रदान करना होगा:public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register("MyProperty", typeof(int), typeof(MyControl), new PropertyMetadata(0, MyPropertyChangedHandler)); private static void MyPropertyChangedHandler(DependencyObject sender, DependencyPropertyChangedEventArgs args) { // Use args.OldValue and args.NewValue here as needed. // sender is the object whose property changed. // Some unboxing required. }
बाइंडिंग मोड
Mode=TwoWay
निर्दिष्ट करने की आवश्यकता को समाप्त करने के लिए Mode=TwoWay
बाइंडिंग में Mode=TwoWay
( TextBox.Text
के व्यवहार के TextBox.Text
) के लिए PropertyMetadata
बजाय FrameworkPropertyMetadata
का उपयोग करने के लिए कोड को अपडेट करें और उचित ध्वज निर्दिष्ट करें:
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(int), typeof(MyControl),
new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
संलग्न निर्भरता गुण
कब इस्तेमाल करें
एक संलग्न संपत्ति एक निर्भरता संपत्ति है जिसे किसी भी DependencyObject
पर लागू किया जा सकता है जो विभिन्न नियंत्रणों या सेवाओं के व्यवहार को बढ़ाने के लिए है जो संपत्ति के अस्तित्व के बारे में जानते हैं।
संलग्न गुणों के लिए कुछ उपयोग के मामलों में शामिल हैं:
- अभिभावक तत्व अपने बच्चों के माध्यम से पुनरावृत्ति करता है और बच्चों पर एक निश्चित तरीके से कार्य करता है। उदाहरण के लिए,
Grid
नियंत्रणGrid.Row
,Grid.Column
,Grid.RowSpan
औरGrid.ColumnSpan
संलग्न गुणों का उपयोग पंक्तियों और स्तंभों में तत्वों को व्यवस्थित करने के लिए करता है। - कस्टम टेम्प्लेट के साथ मौजूदा नियंत्रणों में विज़ुअल्स जोड़ना, उदाहरण के लिए, टेक्स्ट बॉक्स को उप-
TextBox
बिना खाली टेक्स्ट बॉक्स में वॉटरमार्क जोड़ना। - कुछ या सभी मौजूदा नियंत्रणों, जैसे
ToolTipService
याFocusManager
को एक सामान्य सेवा या सुविधा प्रदान करना। इन्हें आमतौर पर संलग्न व्यवहार के रूप में जाना जाता है। - जब दृश्य पेड़ के नीचे वंशानुक्रम की आवश्यकता होती है, उदाहरण के लिए
DataContext
के व्यवहार के समान।
यह आगे दिखाता है कि Grid
उपयोग के मामले में क्या हो रहा है:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="Your Name:" />
<TextBox Grid.Column="1" Text="{Binding FirstName}" />
</Grid>
Grid.Column
एक ऐसी संपत्ति नहीं है जो Label
या Grid.Column
TextBox
पर मौजूद है। बल्कि, Grid
नियंत्रण अपने बाल तत्वों के माध्यम से दिखता है और संलग्न गुणों के मूल्यों के अनुसार उन्हें व्यवस्थित करता है।
कैसे परिभाषित करें
हम इस उदाहरण के लिए Grid
का उपयोग करना जारी रखेंगे। Grid.Column
की परिभाषा नीचे दी गई है, लेकिन DependencyPropertyChangedEventHandler
को संक्षिप्तता के लिए बाहर रखा गया है।
public static readonly DependencyProperty RowProperty =
DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid),
new FrameworkPropertyMetadata(0, ...));
public static void SetRow(UIElement element, int value)
{
if (element == null)
throw new ArgumentNullException("element");
element.SetValue(RowProperty, value);
}
public static int GetRow(UIElement element)
{
if (element == null)
throw new ArgumentNullException("element");
return ((int)element.GetValue(RowProperty));
}
क्योंकि संलग्न गुण विभिन्न प्रकार की वस्तुओं से जुड़े हो सकते हैं, उन्हें सीएलआर गुणों के रूप में लागू नहीं किया जा सकता है। इसके बजाय स्थिर तरीकों की एक जोड़ी पेश की जाती है।
इसलिए, मानक निर्भरता गुणों के विपरीत, संलग्न गुणों को उन वर्गों में भी परिभाषित किया जा सकता है जो DependencyObject
से उत्पन्न नहीं होते हैं।
वही नामकरण RowProperty
जो नियमित निर्भरता गुणों पर लागू होती हैं, वे भी यहां लागू होती हैं: निर्भरता संपत्ति RowProperty
में संबंधित विधियां GetRow
और SetRow
।
चेतावनियां
यद्यपि संपत्ति मान वंशानुक्रम गैर-निर्भर निर्भरता गुणों के लिए कार्य करने के लिए प्रकट हो सकता है, रन-टाइम ट्री में कुछ तत्व सीमाओं के माध्यम से गैर-गुणित संपत्ति के लिए विरासत व्यवहार अपरिभाषित है। जहां आप मेटाडेटा में इनहेरिट्स निर्दिष्ट करते हैं, उन संपत्तियों को पंजीकृत करने के लिए हमेशा RegisterAttached का उपयोग करें।
केवल पढ़ने के लिए निर्भरता गुण
कब इस्तेमाल करें
रीड-ओनली डिपेंडेंसी प्रॉपर्टी एक सामान्य डिपेंडेंसी प्रॉपर्टी के समान है, लेकिन इसे कंट्रोल के बाहर से इसकी वैल्यू सेट नहीं होने देने के लिए संरचित किया जाता है। यह अच्छी तरह से काम करता है यदि आपके पास एक संपत्ति है जो उपभोक्ताओं के लिए विशुद्ध रूप से सूचनात्मक है, जैसे कि IsMouseOver
या IsKeyboardFocusWithin
।
कैसे परिभाषित करें
मानक निर्भरता गुणों की तरह, केवल पढ़ने के लिए निर्भरता वाली संपत्ति को ऐसे वर्ग पर परिभाषित किया जाना चाहिए जो DependencyObject
से निकलता है।
public class MyControl : Control
{
private static readonly DependencyPropertyKey MyPropertyPropertyKey =
DependencyProperty.RegisterReadOnly("MyProperty", typeof(int), typeof(MyControl),
new FrameworkPropertyMetadata(0));
public static readonly DependencyProperty MyPropertyProperty = MyPropertyPropertyKey.DependencyProperty;
public int MyProperty
{
get { return (int)GetValue(MyPropertyProperty); }
private set { SetValue(MyPropertyPropertyKey, value); }
}
}
नियमित निर्भरता गुणों पर लागू होने वाली समान परंपराएँ भी यहाँ लागू होती हैं, लेकिन दो प्रमुख अंतरों के साथ:
-
DependencyProperty
एकprivate
DependencyPropertyKey
। - सीएलआर संपत्ति सेटर
public
बजायprotected
याprivate
।
ध्यान दें कि सेटर MyPropertyPropertyKey
गुजरता है न कि MyPropertyProperty
से SetValue
मेथड से। क्योंकि संपत्ति को केवल पढ़ने के लिए परिभाषित किया गया था, संपत्ति पर SetValue
का उपयोग करने के किसी भी प्रयास का उपयोग ओवरलोड के साथ किया जाना चाहिए जो DependencyPropertyKey
प्राप्त करता है; अन्यथा, एक InvalidOperationException
को फेंक दिया जाएगा।