2013-08-06 132 views
0

我的內容控制「MyControl」,它有一個屬性「GlobalBackground」。 對於我有這樣的風格的項目。在屬性設置中綁定祖先

<ControlTemplate x:Key="XTemplate" TargetType="{x:Type local:MyControlItem}"> 
    <Grid HorizontalAlignment="Stretch"> 
     <Rectangle Height="2" Fill="{Binding GlobalBackground, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=local:MyControl}}"/> 
      ... 
    </Grid> 
</ControlTemplate> 
<Style x:Key="XStyle" TargetType="{x:Type local:MyControlItem}"> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
    <Setter Property="Template" Value="{StaticResource XTemplate}"/> 
</Style> 

這個按預期工作。

現在我想使用綁定到ItemsControl的不同屬性的相同模板。 這樣的想法是設置通過二傳手(風格觸發器) 一個屬性當我這樣做

<ControlTemplate x:Key="XTemplate" TargetType="{x:Type local:MyControlItem}"> 
    <Grid HorizontalAlignment="Stretch"> 
     <Rectangle Height="2" Fill="{TemplateBinding Background}"/> 
      ... 
    </Grid> 
</ControlTemplate> 
<Style x:Key="XStyle" TargetType="{x:Type local:MyControlItem}"> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
    <Setter Property="Background" Value="{Binding GlobalBackground, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=local:MyControl}}" /> 
    <Setter Property="Template" Value="{StaticResource XTemplate}"/> 
</Style> 

綁定失敗。

有沒有辦法在樣式設置器中使用FindAncestor綁定或我只是做錯了什麼?

曼弗雷德

+0

你絕對可以做一個''RelativeSource' Binding'。如果你調試你的應用程序,Visual Studio中的輸出窗口會顯示你的綁定錯誤,這應該可以幫助你找到錯誤的底部。 –

+0

@abe 是的,我知道 - 所以我找到了問題(但沒有解決方案)。 在第一種情況下,綁定就像一個魅力。 在第二種情況VS顯示「無祖先的類型..發現」 正如我在我對謝里登的答案中寫道,我猜測(不確定所有)WPF嘗試(如果用在setter中)解析綁定 - 而當我直接在模板中使用它,它解決了項目在項目控件內部的綁定,至少(當然)可以工作 – ManniAT

回答

0

你似乎已經犯了一個錯誤,宣佈AncestorType ......看到這個例子:在`Style`

<Button Foreground="Blue" Background="Red"> 
    <Rectangle Margin="20" Width="50" Height="50"> 
     <Rectangle.Style> 
      <Style> 
       <Setter Property="Rectangle.Fill" Value="{Binding Foreground, 
        RelativeSource={RelativeSource Mode=FindAncestor, 
        AncestorType={x:Type Button}}}" /> 
      </Style> 
     </Rectangle.Style> 
    </Rectangle> 
</Button> 
+0

正如您可能已經注意到的那樣 - 在我的第一個示例(模板)中,此綁定起作用。 所以祖先的發現一般工作。 我想,WPF會嘗試分配綁定的值(如果在setter中使用的話) - 此時項目控件已創建並且沒有父項。 – ManniAT