代码之家  ›  专栏  ›  技术社区  ›  Daniele Sartori

有人能给我解释一下关于样式和数据触发器的这种行为吗?

  •  1
  • Daniele Sartori  · 技术社区  · 7 年前

    基本上,我有一个复选框,它在viewmodel中绑定了IsChecked属性。然后在datatrigger中计算此属性,以确定进度条的颜色。进度条本身是用我将要展示的代码设计的。

    现在,该代码起作用了:

    <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缺少了什么或出了什么问题吗?(不要介意边界部分)

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mike Strobel    7 年前

    我想你把这些倒过来了 第二 示例有效,而第一个不起作用。

    第一个示例不起作用,因为 Rectangle.Fill 绑定没有意义。您正在绑定 Fill 不管怎样 ProgressBar.DataContext 是更改 Rectangle 定义为:

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

    {TemplateBinding XYZ} 是的缩写形式 {Binding Path=XYZ, RelativeSource={RelativeSource TemplatedParent} . 意思是“绑定到属性” XYZ 在本例中,模板应用于 ProgressBar ,因此我们具有约束力 长方形填满 到进度条的 Background . 当您的 Setters 更新背景,矩形也会更新。