ControlTemplates的Datacontext

时间:2013-09-24 13:02:55

标签: wpf binding datacontext controltemplate

ControlTemplate如何处理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>

但这不会使背景变红。我已经通过控件旁边的ToolSelected验证了ToolbarViewModel Property <Label Content="{Binding ToolSelected}"/>的值实际上是Unlink。所以我认为问题是模板没有使用正确的DataContext,但我不确定。这就是我向你寻求帮助的原因。

Control位于自定义用户控件中,ToolbarViewModel被设置为所有内容的上下文,就像这样。

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

1 个答案:

答案 0 :(得分:4)

尝试从RelativeSource删除DataTrigger.Binding,然后它应该在当前DataContext中有用:

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