使用具有不同绑定的 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>
我有一系列 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>