How can I override a bound property with a DataTrigger
Asked Answered
P

1

10

I've got the following XAML used to display detailed information about an item selected in a list view. I want the rectangle to show the standard info color behind the text except when the selected item represents an error message. The code below doesn't work as is and always shows the info color. It works great if I don't specify a Fill for the root <Rectangle /> element.

<Rectangle Fill="{DynamicResource {x:Static SystemColors.InfoBrushKey}}" 
           RadiusX="4" RadiusY="4">
  <Rectangle.Style>
    <Style TargetType="{x:Type Rectangle}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentMessage.Severity"  
                     Value="Error" >
          <Setter Property="Fill" Value="#20FF0000" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </Rectangle.Style>
</Rectangle>

The snippet doesn't reflect it, but the real code has quite a few possible status levels for the Severity so I don't want to define a trigger for each possible severity. The logic I want is "Use the info color unless the severity is error, then use red".

I'm sure I've misunderstood some fundamental aspect of WPF but can't seem to pinpoint it. Can someone point me in the right direction so that the data triggers I specify will override the existing Fill value when their conditions are true?

Pointsman answered 7/5, 2009 at 6:29 Comment(0)
H
13

You're almost there. Instead of specifying the "default" fill as an attribute on your Rectangle, specify it within the Style:

<Rectangle RadiusX="4" RadiusY="4">
  <Rectangle.Style>
    <Style TargetType="{x:Type Rectangle}">
      <Setter Property="Fill" 
              Value="{DynamicResource {x:Static SystemColors.InfoBrushKey}}" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentMessage.Severity"  
                     Value="Error" >
          <Setter Property="Fill" Value="#20FF0000" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </Rectangle.Style>
</Rectangle>
Honeysucker answered 7/5, 2009 at 7:37 Comment(2)
Yep, that worked. Though...can you explain why? It would seem to me that the Fill property on the Rectangle would be equivalent.Pointsman
I can't, no. This is just from experience. I guess having it set on the object itself overrides anything inside a style.Honeysucker

© 2022 - 2024 — McMap. All rights reserved.