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

时间:2015-04-21 19:03:48

标签: c# wpf xaml data-binding datatrigger

我有一系列TextBlocks,我想要应用Style和DataTrigger。唯一的区别是Binding是视图模型中每个属性的不同属性。

以下是其中一个TextBlocks的简化版本,其中包含Style和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>

所以,在前面的例子中,&#34; IsDevelopmentIsDirty&#34;每个TextBlock的绑定都不同。

我没有最好的运气,找到将此Style合并为一个可以被整个TextBlocks系列使用的声明的最佳方法。

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

在页面顶部声明样式,如下所示

<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}"/>