WPF टेम्प्लेटबाइंडिंग बनाम रिलेटिव सोर्स TemplatedParent


169

इन 2 बाइंडिंग में क्या अंतर है :

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{TemplateBinding Property=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

तथा

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

?


17
यदि आपको टूवे बाइंडिंग की आवश्यकता है, तो आप दूसरे विकल्प का उपयोग करेंगे
जोआचिम किर्शबाउमर

जवाबों:


207

टेम्प्लेटबाइंडिंग एक ही चीज नहीं है। MSDN डॉक्स अक्सर ऐसे लोगों द्वारा लिखे जाते हैं, जिन्हें सॉफ्टवेयर फीचर्स के बारे में मोनोसैलिक SDE को क्विज़ करना होता है, इसलिए बारीकियाँ बिलकुल भी सही नहीं हैं।

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

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

जब आप कर सकते हैं अभ्यास के एक मामले के रूप में टेम्पलेटबाइंडिंग का उपयोग करें, लेकिन बाइंडिंग का डर नहीं है।


18
तो मुख्य याद रखना याद रखें: संकलन समय बनाम रनटाइम। यदि आप रनटाइम के दौरान इसे बदलने का प्रयास करते हैं तो TemplateBinding काम नहीं करेगा। सही ?
PaN1C_Showt1Me

3
यह भी ध्यान दें कि टेम्प्लेटबाइंडिंग के बजाय बाइंडिंग का उपयोग करने का अर्थ यह हो सकता है कि आप डिज़ाइन टाइम के दौरान क्या देखते हैं। कुछ कॉन्फ़िगरेशन में, गुण जो {B बंधन RelativeSource ...} का उपयोग कर रहे हैं, वे डिज़ाइनर में दिखाई नहीं देंगे (हालांकि वे अभी भी रन टाइम के दौरान दिखाई देते हैं), लेकिन यदि आप {TemplateBinding ...} का उपयोग करने के लिए स्विच करते हैं, तो उन गुणों का मूल्यांकन किया जाता है डिजाइन समय के दौरान।
लेफ्लिन

भविष्य के आगंतुकों को मदद करने के लिए एक बात मैं इसमें जोड़ दूंगा क्योंकि टेम्पलेटबाइंडिंग का मूल्यांकन उस समय पर किया जाता है जब आप उपयोगकर्ता द्वारा संलग्न प्रॉपर्टी को बांधने के लिए टेम्पलेटबाइंडिंग का उपयोग नहीं कर सकते हैं। उपयोगकर्ता द्वारा परिभाषित संलग्न गुणों के मामले में, आपको "{बाइंडिंग रिलेटिवसोर्स = {रिलेटिवसोर्स टेम्प्लेटेडपैरेंट} ...}" का उपयोग करना होगा
MNB

35

TemplateBinding - नियमित बंधन का उपयोग करने से अधिक सीमित

  • एक बंधन से अधिक कुशल है लेकिन इसकी कार्यक्षमता कम है
  • केवल एक ControlTemplate के दृश्य पेड़ के अंदर काम करता है
  • Freezables पर गुणों के साथ काम नहीं करता है
  • एक ControlTemplate के ट्रिगर के भीतर काम नहीं करता है
  • गुण सेट करने में एक शॉर्टकट प्रदान करता है (क्रिया के रूप में नहीं), उदाहरण के लिए {TemplateBinding targetProperty}

रेगुलर बाइंडिंग - टेम्पलेटबाइंडिंग की उपरोक्त सीमाएँ नहीं हैं

  • जनक गुणों का सम्मान करता है
  • किसी भी स्पष्ट रूप से निर्धारित मान को हटाने के लिए लक्ष्य मान रीसेट करें
  • उदाहरण: <Ellipse Fill = "{बाइंडिंग रिलेटिवसोर्स = {RelativeSource टेम्पर्डपेंट}, पाथ = बैकग्राउंड}" />

22

एक और बात - TemplateBindings मान को परिवर्तित करने की अनुमति नहीं देता है। वे आपको एक कनवर्टर पास करने की अनुमति नहीं देते हैं और उदाहरण के लिए स्ट्रिंग को स्वचालित रूप से परिवर्तित नहीं करते हैं (जो कि बाइंडिंग के लिए सामान्य है)।


1
धन्यवाद मिरोस्लाव, यह वह समस्या थी जिसका मैं सामना कर रहा था, TemplatedParent का उपयोग करने के लिए स्विच करने से समस्या हल हो गई।
मिकुल्ल्स

17

टेम्प्लेटबाइंडिंग टेम्पलेटेडपैरेंट के साथ बाइंडिंग के लिए एक शॉर्टहैंड है लेकिन यह बाइंडिंग क्लास की सभी क्षमताओं को उजागर नहीं करता है, उदाहरण के लिए आप टेम्पलेटबाइंडिंग से बाइंडिंग को नियंत्रित नहीं कर सकते।


1

मैंने सोचा था कि टेम्पलेटबाइंडिंग फ्रीज़ेबल प्रकार (जिसमें ब्रश ऑब्जेक्ट शामिल हैं) का समर्थन नहीं करता है। समस्या के आसपास पाने के लिए। टेंपलेटेड पेरेंट का उपयोग कर सकते हैं


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.