2009-05-07 19 views
8

Tengo el siguiente XAML utilizado para mostrar información detallada sobre un elemento seleccionado en una vista de lista. Quiero que el rectángulo muestre el color de información estándar detrás del texto, excepto cuando el elemento seleccionado representa un mensaje de error. El código siguiente no funciona como está y siempre muestra el color de información. Funciona muy bien si no especifico un Fill para el elemento raíz <Rectangle />.Cómo puedo anular una propiedad vinculada con un DataTrigger

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

El fragmento no lo refleja, pero el código real tiene un buen número de niveles de estado posibles para la Severidad por lo que no desee definir un disparador para cada posible gravedad. La lógica que quiero es "Usar el color de información a menos que la gravedad sea un error, luego usar rojo".

Estoy seguro de que he entendido mal algunos aspectos fundamentales de WPF, pero parece que no puedo precisarlo. ¿Puede alguien señalarme en la dirección correcta para que los datos desencadenantes que especifico anulen el valor de Relleno existente cuando sus condiciones sean verdaderas?

Respuesta

10

Ya casi está allí. En lugar de especificar el relleno "predeterminado" como un atributo en su rectángulo, especifíquelo dentro del Estilo:

<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> 
+0

Sí, eso funcionó. Aunque ... ¿puedes explicar por qué? Me parece que la propiedad Fill en el Rectángulo sería equivalente. –

+0

No puedo, no. Esto es solo por experiencia. Supongo que tenerlo configurado en el objeto mismo anula cualquier cosa dentro de un estilo. –

Cuestiones relacionadas