2013-09-24 50 views
4

ControlTemplate如何處理datacontext?ControlTemplates的Datacontext

使用後續的模板

<ControlTemplate x:Key="ToolbarButtonHover" TargetType="Button"> 
    <Grid Name="backgroundGrid"> 
     <Image Source="{DynamicResource ResourceKey=Img}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"></Image> 
    </Grid> 
    <ControlTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=DataContext.ToolSelected, RelativeSource={RelativeSource TemplatedParent}}" Value="Unlink"> 
      <Setter TargetName="backgroundGrid" Property="Background" Value="Red" /> 
     </DataTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

與控制

<Button Content="Button" 
     Template="{StaticResource ResourceKey=ToolbarButtonHover}" 
     Height="24" Width="24" Background="Red"> 
    <Button.Resources> 
     <ImageSource x:Key="Img">Resources/Icons/toolSelect.png</ImageSource> 
    </Button.Resources> 
</Button> 

但是,這並不使背景的紅色。我已經驗證ToolbarViewModel屬性ToolSelected的值實際上是通過在控件旁邊有<Label Content="{Binding ToolSelected}"/>來取消鏈接。所以我相信問題是模板不使用正確DataContext,但我不確定這一點。這就是爲什麼我要求你幫忙。

控件位於一個自定義的用戶控件中,ToolbarViewModel被設置爲所有它的上下文,就像這樣。

<UserControl.DataContext> 
    <local:ToolboxView/> 
</UserControl.DataContext> 
+0

什麼是ToolSelected的類型? – franssu

+1

'ControlTemplate'覆蓋所有對象的屬性。因此,一旦你爲你的按鈕設置了一個ControlTemplate,給它一個Background就沒有意義了...... –

+0

他並沒有給按鈕賦予背景,而是給ControlTemplate裏面的Grid。另外如果你使用TemplateBinding,給一個重新模板化控件的背景是完全沒問題的。 – franssu

回答

4

嘗試刪除從DataTrigger.BindingRelativeSource那麼它應該在當前DataContext工作:

<DataTrigger Binding="{Binding ToolSelected}" Value="Unlink"> 
    <Setter TargetName="backgroundGrid" Property="Background" Value="Red" /> 
</DataTrigger>