使用具有不同绑定的 DataTrigger 设置样式

Style with a DataTrigger that has different Bindings

我有一系列 TextBlock,我想对其应用 Style 和 DataTrigger。唯一的区别是每个绑定到视图模型中的不同 属性。

这是带有 Style 和 DataTrigger 的 TextBlock 之一的简化​​版本 "built in"。

        <TextBlock Text="Is development">
            <TextBlock.Style>
                <Style TargetType="{x:Type TextBlock}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsDevelopmentIsDirty}"
                                      Value="True">
                            <Setter Property="FontWeight"
                                    Value="Bold" />
                            <Setter Property="FontStyle"
                                    Value="Italic" />
                            <Setter Property="Foreground"
                                    Value="{StaticResource SCB_TardisBlue}" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>

因此,在前面的示例中,"IsDevelopmentIsDirty" 绑定对于每个 TextBlock 都是不同的。

我只是运气不太好,无法找到将此样式整合到一个声明中以供整个 TextBlock 系列使用的最佳方法。

有没有办法指定 DataTrigger 应该绑定的样式和 属性?如果没有,有什么方法可以做到这一点?提前致谢。

像这样在页面顶部声明样式

<Window.Resources>
  <Style x:Key="MyTextBlockStyle" TargetType="{x:Type TextBlock}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsDevelopmentIsDirty}"
                                  Value="True">
                        <Setter Property="FontWeight"
                                Value="Bold" />
                        <Setter Property="FontStyle"
                                Value="Italic" />
                        <Setter Property="Foreground"
                                Value="{StaticResource SCB_TardisBlue}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
</Window.Resources>

那么TextBlock应该是这样的

<TextBlock Text="Text" Style="{StaticResource MyTextBlockStyle}"/>

如果您想根据 TextBlock 的不同 属性 触发相同的样式更改,您可以使用代理 属性。这是假设它将是一个布尔值 属性,或者一个可以转换为布尔值的值。

解决方案 1

在最简单的解决方案中,您可以使用 Tag 属性

<TextBlock Text="Is development" Tag="{Binding IsDevelopmentIsDirty}" >
   <TextBlock.Style>
      <Style TargetType="{x:Type TextBlock}">
         <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Tag}" Value="True">
               <Setter Property="FontWeight" Value="Bold" />
               <Setter Property="FontStyle" Value="Italic" />
               <Setter Property="Foreground" Value="{StaticResource SCB_TardisBlue}" />
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </TextBlock.Style>
</TextBlock>

Style 内部,当 Tag 属性 为真时触发,然后在外部,您可以将 Tag 属性 绑定到任何您想要的东西想。当然这个 Style 然后可以被提取到一些资源字典中。

解决方案 2

另一个解决方案,例如,如果您需要更多 属性 是创建附加属性

public static class AttachedProperties
{
    public static readonly DependencyProperty ChangeStyleProperty = DependencyProperty.RegisterAttached("ChangeStyle", typeof(bool), typeof(AttachedProperties));

    public static bool GetChangeStyle(DependencyObject d)
    {
        return (bool)d.GetValue(ChangeStyleProperty);
    }

    public static void SetChangeStyle(DependencyObject d, bool value)
    {
        d.SetValue(ChangeStyleProperty, value);
    }
}

然后遵循与 Tag

相同的场景
<TextBlock Text="Is development" prop:AttachedProperties.ChangeStyle="{Binding IsDevelopmentIsDirty}" >
   <TextBlock.Style>
      <Style TargetType="{x:Type TextBlock}">
         <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(prop:AttachedProperties.ChangeStyle)}" Value="True">
               <Setter Property="FontWeight" Value="Bold" />
               <Setter Property="FontStyle" Value="Italic" />
               <Setter Property="Foreground" Value="{StaticResource SCB_TardisBlue}" />
            </DataTrigger>
         </Style.Triggers>
      </Style>
   </TextBlock.Style>
</TextBlock>