Из Документы MSDN , согласно (слегка перефразированному) ответу Ричарда К. Макгуайра:
DataTriggers можно использовать с тегами XML Стиль , ControlTemplate и DataTemplate
Например, если вы попытаетесь добавить триггер к TextBlock
, он выдаст следующую ошибку:
Ошибка: члены коллекции триггеров должны иметь тип EventTrigger
Почему? Trigger
может быть размещен только внутри Style
, ControlTemplate
или DataTemplate
, и мы пытаемся разместить его непосредственно внутри TextBlock
.
В этом случае исправить несложно: просто оберните триггер в стиле , затем поместите этот стиль в TextBlock
, и ошибка исчезнет.
Вот XAML, генерирующий ошибки перед исправлением:
<TextBlock x:Name="Hello" Text="{Binding Hello, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<TextBlock.Triggers>
<DataTrigger Binding="{Binding Hello}" Value="GoGreen">
<Setter Property="Foreground" Value="Green" />
</DataTrigger>
</TextBlock.Triggers>
</TextBlock>
Вот XAML после исправления:
<TextBlock x:Name="Hello" Text="{Binding Hello, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red" />
<Style.Triggers>
<DataTrigger Binding="{Binding Hello}" Value="GoGreen">
<Setter Property="Foreground" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Вот пример скриншота, показывающий, что если мы введем GoGreen
, текст станет зеленым:
... и если мы введем что-то еще, текст по умолчанию будет красным:
В Интернете есть множество бесплатных материалов о триггерах WPF, и все они довольно неплохо объясняют концепцию, и эта страница заставила меня выбросить пенни .