Search code examples
c#wpfxamlstoryboarddatatrigger

Issues with DataTrigger in WPF


I am having issues getting a DataTrigger to call a Storyboard in WPF. I have been working on this for nearly 3 hours so hopefully someone can help!

Here is my XAML Snippet which contains the Storyboard/Trigger.

<Style x:Key="image" TargetType="{x:Type Image}">
    <Style.Resources>
        <Storyboard x:Key="LoadTitleScreen">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="image">
                <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.6" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="image">
                <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
                <DiscreteObjectKeyFrame KeyTime="0:0:0.6" Value="{x:Static Visibility.Collapsed}"/>
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
    </Style.Resources>
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsLoginWrong}" Value="true">
            <DataTrigger.EnterActions>
                    <BeginStoryboard Storyboard="{StaticResource LoadTitleScreen}"/>
            </DataTrigger.EnterActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

Here is my C# code to set the value of the DataTrigger propery:

    public partial class MainWindow : Window, INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private Boolean _isLoginWrong;
    public Boolean IsLoginWrong
    {
        get { return this._isLoginWrong; }

        set
        {
            if (value != this._isLoginWrong)
            {
                this._isLoginWrong = value;
                NotifyPropertyChanged("IsLoginWrong");
            }
        }
    }

    Timer ConnectToServer = new Timer(3000);


    public MainWindow()
    {
        InitializeComponent();
        ConnectToServer.Elapsed += ConnectToServer_Elapsed;
        ConnectToServer.Start();
    }

    void ConnectToServer_Elapsed(object sender, ElapsedEventArgs e)
    {
        IsLoginWrong = true;
    }
}

Solution

  • IsLoginWrong must be a dependency property or a property that implements INotifyPropertyChanged so your Trigger can be notified that it has changed.

    How to implement INotifyPropertyChanged: https://msdn.microsoft.com/library/ms229614(v=vs.100).aspx