0
votes

I have been trying to make it work for 4 days, please help me.

I had a storyboard and everything was fine until I needed to change trigger action from button click to Binding on boolean variable. It's all written in a template and I guess it makes the task more complicated. The code was (and it still works):

    <Border x:Name="panelControl" Grid.RowSpan="4" Margin="0,0,-450,0" VerticalAlignment="Stretch" HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Width="450" Height="275" DataContext="{Binding CurrentPanelViewModel}" >
            <Border.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </Border.RenderTransform>

                <Canvas Background="#FFC6E8E6">
                    ...
                </Canvas>
            </Grid>
        </Border>

    <Grid.Triggers>
            <EventTrigger RoutedEvent="Button.Click" SourceName="AddButton2">
                <BeginStoryboard Name="StartStoryboard">
                    <Storyboard SpeedRatio="12" TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                        <DoubleAnimation 
                            Storyboard.TargetName="panelControl" 
                            Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"
                            Duration="0:0:005" From="0" To="-700" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>

Now I wrote it.

<Border x:Name="panelControl" Grid.RowSpan="4" Margin="0,0,-450,0" VerticalAlignment="Stretch" HorizontalAlignment="Right" RenderTransformOrigin="0.5,0.5" Width="450" Height="275" DataContext="{Binding Path=Controller.LegViewModel.CurrentPanelViewModel}" >
            <Border.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </Border.RenderTransform>

            <Grid.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path = PanelOpened}">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard >
                                        <Storyboard SpeedRatio="12" TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                                            <DoubleAnimation
                                                Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"
                                                Duration="0:0:005" From="0" To="-700" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.EnterActions>

                                <!--<DataTrigger.ExitActions>
                                     you could animate close too if you wanted 
                                </DataTrigger.ExitActions>-->
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Grid.Style>

                <Canvas Background="#FFC6E8E6">
                    ....
                </Canvas>
            </Grid>
        </Border>

and nothing happens. Despite the fact I checked that PanelOpened notifies.

----------UPDATE-----------

I added Value="True" to DataTrigger and now I have an error in my OnPropertyChanged (when propertyName = PanelOpened):

public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        //если PropertyChanged не нулевое - оно будет разбужено
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public bool PanelOpened
    {
        get { return _panelOpened; }
        set
        {
            _panelOpened = value;
            OnPropertyChanged();
        }
    }

error: System.InvalidOperationException: ''[Unknown]' property does not point to a DependencyObject in path '(0).(1)[3].(2)'.'

2

2 Answers

0
votes

A datatrigger triggers when the value from the binding is equal to some value that you specify. But you didn't specify the value. If you want the trigger to "fire" when the value of PanelOpened changes to true, say so:

<DataTrigger Binding="{Binding PanelOpened}" Value="True">
0
votes

The thing is I tried to add DataTrigger to Grid style instead of Border. Working version:

            <Border.Style>
                <Style TargetType="{x:Type Border}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path = PanelOpened}" Value="True">
                            <DataTrigger.EnterActions>
                                <BeginStoryboard >
                                    <Storyboard SpeedRatio="12" TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                                        <DoubleAnimation
                                            Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"
                                            Duration="0:0:005" From="0" To="-700" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.EnterActions>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>