Textblock Style dataTrigger在ItemsControl中不起作用

时间:2011-02-02 13:55:22

标签: .net wpf styles itemscontrol datatrigger

我的ObservableCollection<Object1>类型(下面的代码为Messages)与ItemsControl绑定。 Object1有两个属性,即ErrMsgIsError。如果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}}值是多少?

我怎样才能做到这一点?

2 个答案:

答案 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>

对于包含附加属性的路径或故事板,您通常只需要使用类型(应该在括号中)对属性进行限定。