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

时间:2018-01-25 14:24:23

标签: wpf datatrigger

基本上,我有一个复选框,在viewmodel中绑定了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中缺少什么或出了什么问题吗? (不要介意边境部分)

1 个答案:

答案 0 :(得分:2)

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

第一个例子不起作用,因为Rectangle.Fill绑定没有意义。您将Fill绑定到ProgressBar.DataContext的任何内容。将Rectangle定义更改为:

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

{TemplateBinding XYZ}{Binding Path=XYZ, RelativeSource={RelativeSource TemplatedParent}的缩写形式。它表示&#34;绑定到应用此模板的控件上的属性XYZ&#34;。在这种情况下,模板会应用于ProgressBar,因此我们会将Rectangle.Fill绑定到进度条的Background。当您的Setters更新背景时,矩形也会更新。