我有一系列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应该绑定的样式和属性?如果没有,有什么方法可以做到这一点?我提前感谢。
答案 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}"/>