有人可以向我解释有关样式和数据触发的这种行为吗?

Can someone explain me this behaviour about style and datatrigger?

基本上,我有一个复选框,它在视图模型中绑定了 IsChecked 属性。这个 属性 然后在数据触发器中进行评估,以确定进度条的颜色。进度条本身采用我将要展示的代码设计。

现在,这段代码可以工作了:

<Style x:Key="CustomProgressBar" TargetType="ProgressBar">
   <Style.Triggers>
      <DataTrigger Value="True" Binding="{Binding Path=IsChecked}">
         <Setter Property="Background" Value="Red"/>
      </DataTrigger>
      <DataTrigger Value="False" Binding="{Binding Path=IsChecked}">
          <Setter Property="Background" Value="Yellow"/>
      </DataTrigger>
    </Style.Triggers>
    <Setter Property="Template" >
        <Setter.Value>
            <ControlTemplate TargetType="ProgressBar">
                <Border BorderBrush="{DynamicResource ProgressBorderBrushColor}" BorderThickness="0" Background="{DynamicResource ProgressBackgroundColor}" CornerRadius="0" Padding="0">
                    <Grid x:Name="PART_Track">
                        <Rectangle x:Name="PART_Indicator" HorizontalAlignment="Left">
                            <Rectangle.Style>
                                <Style TargetType="Rectangle">
                                    <Setter Property="Fill" Value="{Binding}"/>
                                </Style>
                            </Rectangle.Style>
                        </Rectangle>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

而以下不是:

<Style x:Key="CustomProgressBar" TargetType="ProgressBar">
    <Setter Property="Template" >
        <Setter.Value>
            <ControlTemplate TargetType="ProgressBar">
                <Border BorderBrush="{DynamicResource ProgressBorderBrushColor}" BorderThickness="0" Background="{DynamicResource ProgressBackgroundColor}" CornerRadius="0" Padding="0">
                    <Grid x:Name="PART_Track">
                        <Rectangle x:Name="PART_Indicator" HorizontalAlignment="Left">
                            <Rectangle.Style>
                                <Style TargetType="Rectangle">
                                    <Style.Triggers>
                                        <DataTrigger Value="True" Binding="{Binding Path=IsChecked}">
                                            <Setter Property="Fill" Value="Red"/>
                                        </DataTrigger>

                                        <DataTrigger Value="False" Binding="{Binding Path=IsChecked}">
                                            <Setter Property="Fill" Value="Yellow"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Rectangle.Style>
                        </Rectangle>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

你能告诉我第二个 xaml 中缺少什么或有什么问题吗? (不介意边框部分)

我认为你有那些倒退:第二个示例有效,而第一个没有。

第一个示例不起作用,因为 Rectangle.Fill 绑定没有意义。您将 Fill 绑定到 ProgressBar.DataContext 是什么。将 Rectangle 定义更改为:

<Rectangle x:Name="PART_Indicator"
            HorizontalAlignment="Left"
            Fill="{TemplateBinding Background}" />

{TemplateBinding XYZ}{Binding Path=XYZ, RelativeSource={RelativeSource TemplatedParent} 的缩写形式。意思是"bind to property XYZ on the control to which this template is applied"。在本例中,模板应用于 ProgressBar,因此我们将 Rectangle.Fill 绑定到进度条的 Background。当您 Setters 更新背景时,矩形也会更新。