我的ObservableCollection<Object1>
类型(下面的代码为Messages
)与ItemsControl
绑定。 Object1有两个属性,即ErrMsg
和IsError
。如果ErrMsg
为错误(即如果IsError
为真),我想以红色显示<ItemsControl
Height="Auto"
Background="White"
ItemsSource="{Binding Messages}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock
Margin="5,0,0,0"
Text="{Binding ErrMsg}"
Width="Auto"
Foreground="Black">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger
Binding="{Binding IsError}"
Value="true">
<Setter
Property="TextBlock.Foreground"
Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
,否则为黑色。
IsError
问题是所有消息总是以黑色显示,而不管{{1}}值是多少?
我怎样才能做到这一点?
答案 0 :(得分:7)
那是因为你在文本块声明中指定了Foreground="Black"
。本地值(在元素本身上设置)会覆盖样式值(包括触发器)。
要解决此问题,只需将黑色前景的设置移至样式:
<TextBlock Margin="5,0,0,0"
Text="{Binding Value}"
Width="Auto">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground"
Value="Black"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsError}"
Value="true">
<Setter Property="Foreground"
Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
答案 1 :(得分:0)
我认为您只需要从属性中删除TextBlock
前缀,并将样式中的前景设置为黑色:
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Black"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsError}" Value="true">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
对于包含附加属性的路径或故事板,您通常只需要使用类型(应该在括号中)对属性进行限定。