2010-09-06 293 views
6

我的問題是將一個元素的屬性正確綁定到另一個元素。使用FindAncestor綁定網格高度並將AncestorLevel綁定到另一個網格

這裏是我的代碼的結構:

  1. 數據模板包含一個網格(我們稱之爲網GridA),並在網格中,我指定一個控件的實例,稱爲ControlA

  2. ControlA是包含GridUserControlControlA(代碼隱藏)中有自定義邏輯,用於動態構建內容 - 但簡而言之,它使用另一個數據模板。

  3. ControlA的數據模板由另一個Grid組成。我想將此數據模板中此網格的Height屬性綁定到我上面第一個項目符號點(網格名爲GridA)中引用的數據模板中GridHeight屬性。

這裏是我已經用於綁定的XAML,但本質上,它不是工作,因爲它沒有找到網格:

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

據我所知,通過指定AncestorLevel=2,它將使用您正在查找的類型的第二個「找到」事件,在這種情況下,類型爲Grid。所以在我看來,它將首先找到ControlA中的Grid,然後它將繼續向上走,並在第一個數據模板中找到Grid,這是Grid,名稱爲GridA。這應該是第二次發生,是正確的?

回答

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> 

順便說一句,你的設計聽起來就像是戰鬥WPF的佈局系統,而不是去擁抱它。因此,你可能會爲自己創造很多不必要的痛苦。

+0

感謝您的反饋意見。我同意你對設計的評論 - 這不是我的選擇,而是在我加入這個項目之前完成的。 關於您的建議,它是必須綁定到第一個網格的第三個網格。所以,你的第三個網格的例子指定AncestorLevel = 2,這就是我在我的例子中所陳述的。所以,我很困惑。如果我們都指定了AncestorLevel = 2,那麼我做錯了什麼? – Chris 2010-09-06 14:23:48

+0

我有三個網格,而你聲明你有兩個網格。但也許我誤解了你的問題。如果您將您的祖先等級更改爲1,它會起作用嗎? – 2010-09-06 14:48:12

0

我錯過了什麼,或者你可以使用RowDefinitions的SharedSizeGroup屬性,並在最外層的控件上設置Grid.IsSharedSizeGroup="True"

+0

是的,請閱讀本文以瞭解SharedSizeGroup的侷限性:http://blogs.interknowlogy.com/2007/08/27/grid-size-sharing-in-wpf – Marc 2014-09-19 06:43:17