From MSDN Docs, as per the (slightly paraphrased) answer from Richard C. McGuire:
DataTriggers can be used with XML tags Style, ControlTemplate and DataTemplate
For example, if you attempt to add a trigger to a TextBlock
, it will generate this error:
Error: Triggers collection members must be of type EventTrigger
Why? A Trigger
can only be placed inside a Style
, ControlTemplate
or DataTemplate
, and we are trying to place it directly inside a TextBlock
.
In this case, the fix is easy: just wrap the trigger in a style, then place this style inside the TextBlock
, and the error will disappear.
Here is the error-generating XAML before the fix:
<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>
Here is the XAML after the fix:
<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>
Here is a sample screenshot showing that if we enter GoGreen
, the text goes green:
... and if we enter something else, the text defaults to red:
There is loads of free material on the web about WPF triggers, and all of them do a reasonably good job of explaining the concept, and this page was the one that made the penny drop for me.