2009-04-01 16 views
20

का उपयोग {Binding ElementName=foo} है, क्या यह दृश्य या तार्किक पेड़ को देखेगा?बाइंडिंग एलिमेंटनाम। क्या यह विजुअल ट्री या लॉजिकल ट्री

Of logical and visual trees in WPF | Data See, Data Do

जब तार्किक पेड़ फर्क पड़ता है?

जब ऐसी में {बाइंडिंग ElementName = फू} के रूप में एक नाम को खोजते,, खोज वंश एक नाम गुंजाइश तलाश में ऊपर चलता है, फिर बस के रूप में यह दाय संपत्तियों के लिए करता है।

ElementName binding in Silverlight via Attached Behaviours

आदेश में इस सक्षम करने के लिए, WPF अपने दृश्य ट्री के अंतर्गत अन्य तत्वों लगाने

करने के लिए बाध्य करने के लिए आप एक शक्तिशाली तंत्र देने, ElementName और RelativeSource बाइंडिंग प्रदान करता है

संपादित करें:

ऐसा लगता है कि लॉजिकल ट्री ElementName द्वारा बाध्यकारी के लिए उपयोग किया जाता है।

तर्क # 1.

MSDN लेख FrameworkElement Class के अनुसार:

FrameworkElement फैली UIElement और निम्नलिखित क्षमताएं जोड़ता है:

  • बाध्यकारी डेटा और गतिशील संसाधन संदर्भ के लिए समर्थन: डेटा बाध्यकारी और संसाधनों के लिए संपत्ति-स्तरीय समर्थन है कार्यान्वित DependencyProperty वर्ग द्वारा और संपत्ति प्रणाली में सन्निहित है, लेकिन एक सदस्य मूल्य है कि एक अभिव्यक्ति ( प्रोग्रामिंग निर्माण कि दोनों डेटा बाइंडिंग और गतिशील संसाधनों का आधार) के रूप में संग्रहीत किया जाता है को हल करने की क्षमता द्वारा कार्यान्वित किया जाता FrameworkElement। अधिक जानकारी के लिए, डेटा बाध्यकारी अवलोकन और संसाधन अवलोकन देखें।

तर्क # 2.

ElementNamex:Name को अंक है, तो यह नाम कुछ कैसे पाया जाना चाहिए। NameScope अवधारणा है।

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

दूसरी ओर, Visual classFindName विधि है, और न ही INameScope लागू।

+0

लॉजिकल-ट्री का इस्तेमाल किया गया। बाद में विवरण पोस्ट करेंगे। – alex2k8

उत्तर

6

मुझे लगता है कि यह तार्किक पेड़ है। ControlTemplates का उपयोग करते समय, आप एक दृश्य पेड़ को दूसरे के साथ बदल रहे हैं, लेकिन मुझे नहीं लगता कि आप ControlTemplate के अंदर परिभाषित नामों का संदर्भ दे सकते हैं।

उदाहरण के लिए:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <Grid.Resources> 
      <ControlTemplate x:Key="Foo" TargetType="Button"> 
       <Border x:Name="border" Background="Red"> 
        <Label Content="{TemplateBinding Content}"></Label> 
       </Border> 
      </ControlTemplate> 
     </Grid.Resources> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition></ColumnDefinition> 
      <ColumnDefinition></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Button x:Name="buttonFoo" Background="Green" HorizontalAlignment="Center" VerticalAlignment="Center" Template="{DynamicResource Foo}">Foo</Button> 
     <Label x:Name="labelBar" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Background="{Binding ElementName=border, Path=Background}">Bar</Label> 
    </Grid> 
</Page> 

तत्व ControlTemplate में "सीमा" का नाम नहीं मिल रहा है, लेकिन labelBar के "buttonFoo" के लिए बाध्य में ElementName बदलते पृष्ठभूमि ग्रीन, के रूप में की उम्मीद करता है।

0

एक अर्थ में एक बाध्यकारी की ElementName संपत्ति (उत्तर नीचे देखें) तार्किक पेड़ से दूर काम करता है क्योंकि एक Xaml में तार्किक पेड़ पर पूरी तरह एक विशिष्ट नियंत्रण परमात्मा के लिए ElementName उपयोग कर रहा है।

क्या यह दृश्य या तार्किक पेड़ को देखेगा?

आधार आप का प्रस्ताव गलत है, या तो पेड़ पर नहीं देखने प्रति-se है। एक तार्किक पेड़ के विरासत DataContext को डिफॉल्ट करने के बजाय बाध्यकारी द्वारा उपयोग किए गए प्रतिबिंब ऑपरेशन के लिए स्रोत संपत्ति सेट कर रहा है।

एक Binding.ElementName Property (System.Windows.Data) (बोल्ड मेरा) के प्रलेखन पढ़ता हैं:

"... ElementName संपत्ति तरीकों से आप स्पष्ट रूप से एक बाध्यकारी की स्रोत सेट और विरासत में मिला डेटा ओवरराइड कर सकते हैं में से एक है संदर्भ। "

स्रोत किसी भी instantiated वस्तु जो वर्तमान संचालन नाम स्थान जो पहुँचा जा सकता है और के बंद परिलक्षित भीतर है।

लॉजिकल ट्री (लेकिन इसमें भी नहीं है) में कोई और कम नहीं होगा और अधिकतर लोग नाम Xaml में तार्किक आइटम हैं, लेकिन दृश्य पेड़ में भी हो सकते हैं।


अधिक जानकारी के लिए Data Binding Overview देखें।

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