2009-05-07 3 views
8

У меня есть следующий XAML, используемый для отображения подробной информации об элементе, выбранном в виде списка. Я хочу, чтобы прямоугольник отображал стандартный информационный цвет за текстом, за исключением случаев, когда выбранный элемент представляет сообщение об ошибке. Код ниже не работает, как есть, и всегда показывает информационный цвет. Он отлично работает, если я не укажу Fill для корневого элемента <Rectangle />.Как переопределить свойство bound с 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> 

Сниппает не отражает, но реальный код имеет довольно много возможных уровней состояния для Серьезности, так что я не хочу, чтобы определить триггер для каждой возможной степени тяжести. Логика, которую я хочу, - «Использовать информационный цвет, если только серьезность не является ошибкой, а затем используйте красный цвет».

Я уверен, что неправильно понял какой-то фундаментальный аспект WPF, но, похоже, не могу точно определить его. Может ли кто-нибудь указать мне в правильном направлении, чтобы указанные триггеры данных переопределили существующее значение Fill, когда их условия верны?

ответ

10

Вы почти у цели. Вместо указания «заполнения по умолчанию» как атрибута на вашем прямоугольнике укажите его в стиле:

<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

Да, это сработало. Хотя ... можешь объяснить, почему? Мне кажется, что свойство Fill на Rectangle будет эквивалентным. –

+0

Не могу, нет. Это просто из опыта. Я предполагаю, что он установлен на самом объекте, переопределяя что-либо внутри стиля. –

Смежные вопросы