【问题标题】:Style with a DataTrigger that has different Bindings具有不同绑定的 DataTrigger 的样式
【发布时间】:2015-06-29 03:08:03
【问题描述】:

我有一系列文本块,我想对其应用样式和数据触发器。唯一的区别是 Binding 是针对每个视图模型中的不同属性。

这是其中一个“内置”样式和 DataTrigger 的 TextBlock 的简化版本。

        <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 应该绑定的样式和属性?如果没有,有什么方法可以做到这一点?提前致谢。

【问题讨论】:

    标签: c# wpf xaml data-binding datatrigger


    【解决方案1】:

    如果您想根据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>
    

    【讨论】:

    • 我个人更喜欢 AttachedProperty 路由而不是使用 Tag 属性,但两者都可以正常工作
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 2019-04-29
      • 2015-08-03
      • 2011-10-09
      • 2013-10-19
      • 2017-01-23
      • 2014-01-26
      • 2017-08-22
      • 2015-10-07
      相关资源
      最近更新 更多