【问题标题】:TemplateBinding from a Style DataTrigger In ControlTemplateControlTemplate 中样式 DataTrigger 的模板绑定
【发布时间】:2011-10-09 20:23:10
【问题描述】:

在以下 XAML 中,我使用带边框的矩形作为 ToggleButton 的模板。 我希望 BorderBrush 是一种不同的颜色,以反映 ToggleButton.IsChecked 的变化值。 不幸的是,我在 DataTrigger 中使用 TemplateBinding 的尝试不起作用。我需要做什么?

<StackPanel Orientation="Horizontal">
    <StackPanel.Resources>
        <ControlTemplate x:Key="ButtonAsSwatchTemplate">
            <Border BorderThickness="1">
                <Border.Style>
                    <Style>
                        <Setter Property="BorderBrush" Value="Gainsboro" /> 
                        <Style.Triggers>
                            <!-- TemplateBinding doesn't work.-->
                            <DataTrigger                              
                                 Binding={TemplateBinding Property=IsChecked}    
                                 Value="True">
                                <Setter Property="BorderBrush" Value="Black" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
                <Rectangle Fill="{TemplateBinding Property=Background}"
                           Width="15" Height="15" />
            </Border>
        </ControlTemplate>
    </StackPanel.Resources>
    <ToggleButton Template="{StaticResource ButtonAsSwatchTemplate}"
                  HorizontalAlignment="Center" VerticalAlignment="Center"
                  Margin="2" Background="Red" />
</StackPanel>

编辑

当我构建并重新加载设计器时,我收到以下错误:

错误 1 ​​属性“Binding”不支持“TemplateBindingExpression”类型的值。

解决方案

<StackPanel Orientation="Horizontal">
    <StackPanel.Resources>
        <ControlTemplate x:Key="ButtonAsSwatchTemplate">    
            <Border x:Name="SwatchBorder" BorderThickness="1">
                <Rectangle Fill="{TemplateBinding Property=Background}" Width="15" Height="15" />
            </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="ToggleButton.IsChecked" Value="True">
                <Setter TargetName="SwatchBorder" Property="BorderBrush" Value="Yellow" />
            </Trigger>
        </ControlTemplate.Triggers>
            </ControlTemplate>
        </StackPanel.Resources>
    <RadioButton Template="{StaticResource ButtonAsSwatchTemplate}"
        GroupName="CropGuidesColourRadioButtonGroup"
        IsChecked="{Binding Checked}" Margin="2" Background="Red" />
    <RadioButton Template="{StaticResource ButtonAsSwatchTemplate}"
        GroupName="CropGuidesColourRadioButtonGroup" 
        IsChecked="{Binding Checked}" Margin="2" Background="Black" />
    ...
</StackPanel>

【问题讨论】:

    标签: wpf datatrigger templatebinding control-template


    【解决方案1】:

    您可以在 ControlTemplate 中使用触发器,例如

    <StackPanel Orientation="Horizontal">
        <StackPanel.Resources>
            <ControlTemplate x:Key="ButtonAsSwatchTemplate">
                <Border x:Name="myBorder" BorderBrush="Gainsboro" BorderThickness="1">
                    <Rectangle Fill="{TemplateBinding Property=Background}" Width="15" Height="15" />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="ToggleButton.IsChecked" Value="True">
                        <Setter TargetName="myBorder" Property="BorderBrush" Value="Black" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </StackPanel.Resources>
        <ToggleButton Template="{StaticResource ButtonAsSwatchTemplate}"
                  HorizontalAlignment="Center" VerticalAlignment="Center"
                  Margin="2" Background="Red" />
    </StackPanel>
    

    【讨论】:

    • 谢谢。我一直在尝试在 ControlTemplate 触发器中执行 TemplateBindings,但没有意识到我可以从 controltemplate 访问控件的 DependencyProperties
    【解决方案2】:

    我马上看到的一个问题是您将 BorderBrush 设置为 Border 上的本地属性值。这将始终覆盖样式应用的值。尝试删除显式 BorderBrush 属性,看看是否有效。

    边框 BorderBrush="Gainsboro" BorderThickness="1"

    Dependency Property Value Inheritance

    【讨论】:

    • 好电话,我已经从我的代码中删除了它并更新了我的问题中的示例,但我仍然收到我在上面添加的错误作为编辑。
    猜你喜欢
    • 2015-10-07
    • 2013-07-10
    • 2018-05-08
    • 2015-06-29
    • 1970-01-01
    • 2017-01-23
    • 2019-04-29
    • 2014-05-23
    • 2017-08-22
    相关资源
    最近更新 更多