.net - track - Los activadores de colección de miembros deben ser del tipo EventTrigger
iniciar sesion tag manager (4)
He creado un UserControl, similar al siguiente:
<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>
He estado tratando de usar un Data Trigger para hacer que el StackPanel de ''Lanzamiento'' se haga visible cuando se active el ToggleButton, y de lo contrario permanecerá colapsado. Sin embargo, en el tiempo de ejecución me aparece un error que indica "Inicialización fallida del objeto (ISupportInitialize.EndInit). Los activadores de la colección de los miembros deben ser del tipo EventTrigger". He intentado agregarlo a la colección de activadores de UserControl y StackPanel sin éxito. Mi disparador XAML se parece a lo siguiente:
<DataTrigger Binding="{Binding ElementName=ToggleLaunch, Path=IsChecked}" Value="True">
<Setter TargetName="Launch" Property="UIElement.Visibility" Value="Visible" />
</DataTrigger>
De MSDN Docs , según la respuesta (ligeramente parafraseada) de Richard C. McGuire:
Los DataTriggers se pueden usar con etiquetas XML Style , ControlTemplate y DataTemplate
Por ejemplo, si intenta agregar un disparador a un TextBlock
, generará este error:
Error: los activadores de los miembros de la colección deben ser del tipo EventTrigger
¿Por qué? Un Trigger
solo se puede colocar dentro de un Style
, ControlTemplate
DataTemplate
o DataTemplate
, y estamos tratando de colocarlo directamente dentro de un TextBlock
.
En este caso, la solución es fácil: simplemente ajuste el disparador en un estilo , luego coloque este estilo dentro del TextBlock
y el error desaparecerá.
Aquí está el XAML generador de errores antes de la solución:
<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>
Aquí está el XAML después de la solución:
<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>
Aquí hay una captura de pantalla de muestra que muestra que si ingresamos a GoGreen
, el texto se vuelve verde:
... y si ingresamos algo más, el texto por defecto es rojo:
Hay un montón de material gratuito en la web sobre los desencadenantes de WPF, y todos ellos hacen un trabajo razonablemente bueno de explicar el concepto, y esta página fue la que hizo que cayera un centavo .
Esto puede ser obsoleto, pero lo siguiente funciona para mí. Podría ayudar a las personas que se encuentran con el problema con: "Los activadores de la colección de miembros deben ser del tipo EventTrigger"
<Control>
<Control.Template>
<ControlTemplate >
<!-- Design -->
<StackPanel>
<CheckBox Name="CollapseControl" Content="Show" IsChecked="False" />
<Label Name="CollapseTarget" Content="MyContent" Visibility="Collapsed" />
</StackPanel>
<!-- Triggers -->
<ControlTemplate.Triggers >
<Trigger SourceName="CollapseControl" Property="IsChecked" Value="True" >
<Setter TargetName="CollapseTarget" Property="Visibility" Value="Visible" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Control.Template>
</Control>
Encapsular "lo que desea controlar" dentro de un objeto de Control le permite usar la Plantilla Control.para usar cualquier disparador que desee. De esta manera, puede usar los (datos) activadores directamente en su XAML donde desee sin definir un estilo estático o un UserControl completamente nuevo.
Logré averiguarlo. Olvidó que los Data Triggers están diseñados para Style, ControlTemplate y DataTemplate según los documentos de MSDN.
La solución fue usar un EventTrigger como se indica en el mensaje de error. Mi solución fue la siguiente:
<EventTrigger RoutedEvent="ToggleButton.Checked">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility"
Storyboard.TargetName="LaunchButtons">
<DiscreteObjectKeyFrame KeyTime="0:0:0"
Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="ToggleButton.Unchecked">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility"
Storyboard.TargetName="LaunchButtons">
<DiscreteObjectKeyFrame KeyTime="0:0:0"
Value="{x:Static Visibility.Collapsed}" />
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
Voy a dejar de marcar esto como la respuesta en caso de que alguien más tenga otra solución.
También puede vincular la Visibilidad en su panel de la pila a la propiedad IsChecked en el ToggleButton. Necesitaría utilizar un ValueConverter personalizado. Aquí hay uno que encontré en línea:
/// <summary>
/// WPF/Silverlight ValueConverter : Convert boolean to XAML Visibility
/// </summary>
[ValueConversion(typeof(bool), typeof(Visibility))]
public class VisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (value != null && (bool)value) ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
Visibility visibility = (Visibility)value;
return (visibility == Visibility.Visible);
}
}