具有不同绑定的DataTrigger样式

3

我有一系列TextBlocks,我想为它们应用样式和DataTrigger。唯一的区别是每个TextBlock绑定到视图模型中的不同属性。

下面是一个简化版本的TextBlock,其中包含“内置”的样式和DataTrigger。

        <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都是不同的。

我并没有找到将此样式合并为一个声明以供整个TextBlocks系列使用的最佳方法,运气不是很好。

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

2个回答

3
如果您想基于不同的属性触发相同的样式更改,取决于 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>

2
我个人更喜欢使用AttachedProperty而不是Tag属性,但两者都可以正常工作。 - Rachel

-1

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

<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 Text="Text" Style="{StaticResource MyTextBlockStyle}"/>

完全没有回答问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接