Стиль TextBlock dataTrigger не работает внутри ItemsControl - PullRequest
2 голосов
/ 02 февраля 2011

У меня есть тип ObservableCollection<Object1> (Messages в коде ниже), который связан с ItemsControl. Объект1 имеет два свойства, а именно 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?

Как мне этого добиться?

Ответы [ 2 ]

8 голосов
/ 02 февраля 2011

Это потому, что вы указываете 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>
0 голосов
/ 02 февраля 2011

Я думаю, вам просто нужно удалить префикс 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>

Как правило, необходимо квалифицировать свойство только с типом (который должен быть в скобках) для путей, которые включают в себя присоединенные свойства, или для раскадровок.

...