DataTemplates的WPF样式触发器

时间:2014-10-30 15:44:36

标签: c# wpf xaml

我想为DataTemplate中的控件设置触发器。每当我在DataTemplate内设置控件的属性时,它似乎无效。但是,如果不在TextBlock内的DataTemplate内设置属性,那么我可以在样式中看到Trigger的效果(它有效)。我不确定使用伴随DataTemplate的样式触发器是好还是不好! XAML在下面;

<Grid>
    <Grid.Resources>
        <Style TargetType="TextBlock" x:Key="BlockOf">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="FontWeight" Value="ExtraBold" />
                    <Setter Property="FontSize" Value="22" />
                </Trigger>
        </Style.Triggers>
    </Style>
</Grid.Resources>

...........

按钮的DataTemplate,

<Button.ContentTemplate>
    <DataTemplate DataType="Button">
        <TextBlock Style="{DynamicResource BlockOf}" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"
FontStyle="Italic" FontSize="9"/>
    </DataTemplate>
</Button.ContentTemplate>

1 个答案:

答案 0 :(得分:1)

我在这里可以看到两个问题。第一个是当前触发器仅适用于TextBlock内的Button,而不是整个Button。您可以使用DataTrigger RelativeSource绑定来更改它。第二个问题是即使鼠标结束TextBlock Style.Trigger也无法覆盖您针对TextBlock设置的本地值,因此您需要将默认值Setter带入Style }}。查看Dependency Property Setting Precedence List

<Style TargetType="TextBlock" x:Key="BlockOf">
    <Setter Property="FontStyle" Value="Italic"/>
    <Setter Property="FontSize" Value="9"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=IsMouseOver}" Value="True">
            <Setter Property="FontWeight" Value="ExtraBold" />
            <Setter Property="FontSize" Value="22" />
        </DataTrigger>
    </Style.Triggers>
</Style>

然后TextBlock只需

<TextBlock Style="{DynamicResource BlockOf}" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" />