2010-09-06 38 views
6

मेरे सवाल का FindAncestor और AncestorLevel का उपयोग के बारे में ठीक से एक से दूसरे तत्व की संपत्ति बाध्यकारी है।बाध्यकारी ग्रिड ऊंचाई एक और ग्रिड

यहाँ मेरी कोड की संरचना है:

  1. डाटा खाका एक ग्रिड (चलो ग्रिड GridA कहा जाता है) शामिल है, और ग्रिड में, मैं एक नियंत्रण का एक उदाहरण निर्दिष्ट करते हैं, ControlA कहा जाता है।

  2. ControlAUserControl है जिसमें Grid है। ControlA (कोड-बैक) में कस्टम तर्क है जो गतिशील रूप से सामग्री बनाता है - लेकिन संक्षेप में, यह एक और डेटा टेम्पलेट का उपयोग करता है।

  3. ControlA के लिए डेटा टेम्पलेट में Grid शामिल हैं। मैं ऊपर मेरी पहली बुलेट बिंदु में संदर्भित डेटा टेम्पलेट में Grid की Height संपत्ति (ग्रिड GridA कहा जाता है) के लिए इस डेटा टेम्पलेट में इस ग्रिड के लिए Height संपत्ति बाध्य करने के लिए चाहते हैं।

यहाँ XAML कि मैं बंधन के लिए इस्तेमाल किया है है, लेकिन अनिवार्य रूप से, यह काम कर रहा is not, के रूप में अपनी ग्रिड नहीं मिल रहा:

<Grid Height="{Binding Path=ActualHeight, 
         RelativeSource={RelativeSource FindAncestor, 
             AncestorType=Grid, 
             AncestorLevel=2}, 
         UpdateSourceTrigger=PropertyChanged}"> 
</Grid> 

मैं समझता हूँ कि निर्दिष्ट करने AncestorLevel=2 द्वारा, यह है कि जिस प्रकार की आप खोज रहे हैं उसकी दूसरी "मिली" घटना का उपयोग करेंगे, इस मामले में, प्रकार Grid है। तो मेरे मन में, यह पहली ControlA में Grid मिलेगा, तो यह पहली डेटा टेम्पलेट, जो Grid नामित GridA है में Grid पेड़ पर चलना और पता लगाने के लिए जारी रहेगा। यह दूसरी घटना होनी चाहिए, सही?

उत्तर

6

आप दूसरे ग्रिड से अपनी खोज शुरू कर रहे हैं, आप वास्तव में चाहते हैं पूर्वज स्तर = 1 (जो डिफ़ॉल्ट है)। का निरीक्षण करें:

<Grid x:Name="first"> 
    <Grid x:Name="second"> 
     <Grid x:Name="third" Tag="{Binding Name, RelativeSource={RelativeSource FindAncestor, AncestorType=Grid, AncestorLevel=2}}"> 
      <!-- displays "first", not "second" --> 
      <TextBlock Text="{Binding Tag, ElementName=third}"/> 
     </Grid> 
    </Grid> 
</Grid> 

Btw, अपने डिजाइन लगता है यह लड़ता है जैसे कि यह गले लगाने के बजाय WPF के लेआउट प्रणाली। इस प्रकार, आप शायद अपने लिए बहुत अनावश्यक दर्द बना रहे हैं।

+0

प्रतिक्रिया के लिए धन्यवाद। मैं डिजाइन के बारे में टिप्पणियों पर आपसे सहमत हूं - यह मेरी पसंद नहीं थी और इस परियोजना के अतिरिक्त होने से पहले किया गया था। अपने सुझाव के बारे में, यह तीसरी ग्रिड है कि पहले ग्रिड के लिए बाध्य होगा। तो, तीसरे ग्रिड के लिए आपका उदाहरण AncestorLevel = 2 निर्दिष्ट करता है, जो मैंने अपने उदाहरण में कहा है। तो, मैं उलझन में हूँ। अगर हम दोनों पूर्वज पूर्ववत = 2 निर्दिष्ट कर रहे हैं, तो मैं गलत तरीके से क्या कर रहा हूं? – Chris

+0

मेरे पास तीन ग्रिड हैं, जबकि आप कहते हैं कि आपके पास दो हैं। लेकिन शायद मैंने आपके प्रश्न को गलत समझा। क्या यह काम करता है यदि आप अपने पूर्वजों के स्तर को 1 में बदलते हैं? –

0

क्या मुझे कुछ याद आ रही है, या क्या आप रोडाडिनेशन की SharedSizeGroup संपत्ति का उपयोग कर सकते हैं और बाहरी नियंत्रण पर Grid.IsSharedSizeGroup="True" सेट कर सकते हैं?

+0

हाँ, कृपया इस लेख यहाँ SharedSizeGroup की सीमाओं को समझने के लिए पढ़ें: http://blogs.interknowlogy.com/2007/08/27/grid-size-sharing-in-wpf – Marc

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