触发器集合成员必须是事件触发器类型。

36

我创建了一个类似下面的UserControl:

<UserControl>
    <StackPanel Orientation="Vertical">
        <StackPanel x:Name="Launch" Orientation="Horizontal" Visibility="Collapsed">
            <!-- Children here -->
        </StackPanel>
        <ToggleButton x:Name="ToggleLaunch" IsChecked="False" Content="Launch"/>
    </StackPanel>
</UserControl>

我一直在尝试使用DataTrigger,使'ToggleButton'被选中时让'Launch' StackPanel可见,否则保持折叠状态。然而,在运行时,我收到一个错误,指出“Failed object initialization (ISupportInitialize.EndInit)。Triggers collection members must be of type EventTrigger”。我已经尝试将其添加到UserControl和StackPanel的触发器集合中,但没有成功。我的触发器XAML如下:

<DataTrigger Binding="{Binding ElementName=ToggleLaunch, Path=IsChecked}" Value="True">
    <Setter TargetName="Launch" Property="UIElement.Visibility" Value="Visible"/>
</DataTrigger>
4个回答

58

根据 Richard C. McGuire(略有改动)的回答,从 MSDN 文档

DataTrigger 可以与 XML 标记 StyleControlTemplateDataTemplate 一起使用。

例如,如果您尝试向 TextBlock 添加触发器,它会生成此错误:

错误:Triggers 集合成员必须是 EventTrigger 类型

为什么呢?因为 Trigger 只能放在 StyleControlTemplateDataTemplate 中,而我们正在直接将其放在 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时,文本变为绿色:

enter image description here

... 而如果我们输入其他内容,则文本默认为红色:

enter image description here

关于WPF触发器,网络上有大量的免费材料,它们都相当好地解释了这个概念,而这个网页让我茅塞顿开。


8
如果您已经在UI控件上设置了Style资源(就像我遇到的情况),为了避免进一步的错误,只需将其转换为具有DataTrigger的本地样式的基础样式。示例代码如下: