WPF MVVM - триггер раскадровки об изменении свойства происходит только один раз - PullRequest
0 голосов
/ 08 мая 2018

В моей модели просмотра у меня есть таймер, который должен заставлять фон границы мигать каждые 5 минут.

Граница на мой взгляд:

<Border Name="btnBorder" Grid.Row="0" Grid.Column="0" Opacity="1" CornerRadius="10,10,0,0">
    <Border.Style>
        <Style TargetType="Border">
            <Style.Setters>
                <Setter Property="Background" Value="#e2e2e2"></Setter>
            </Style.Setters>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=ViewEventTrigger}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
                                    <EasingColorKeyFrame KeyTime="00:00:00.000" Value="#e2e2e2"/>
                                    <EasingColorKeyFrame KeyTime="00:00:00.500" Value="#163f6b"/>
                                    <EasingColorKeyFrame KeyTime="00:00:01.000" Value="#e2e2e2"/>
                                    <EasingColorKeyFrame KeyTime="00:00:01.500" Value="#163f6b"/>
                                    <EasingColorKeyFrame KeyTime="00:00:02.000" Value="#e2e2e2"/>
                                    <EasingColorKeyFrame KeyTime="00:00:02.500" Value="#163f6b"/>
                                    <EasingColorKeyFrame KeyTime="00:00:03.000" Value="#e2e2e2"/>
                                    <EasingColorKeyFrame KeyTime="00:00:03.500" Value="#163f6b"/>
                                    <EasingColorKeyFrame KeyTime="00:00:04.000" Value="#e2e2e2"/>
                                </ColorAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

Недвижимость с учетом модели:

private string _viewEventTrigger = "";
public string ViewEventTrigger
{
    get => _viewEventTrigger ?? (_viewEventTrigger = "");
    private set
    {
        if (_viewEventTrigger == value)
            return;

        _viewEventTrigger = value;
        OnPropertyChanged();
    }
}

И метод, который должен вызвать ... ну, триггер:

private void ShowInfocenterIfAnyItinirary(object sender, ElapsedEventArgs e)
{
    ViewEventTrigger = "";
    ViewEventTrigger = "True";
}

Я тестирую раскадровку, вызывая ее с помощью MouseEnter. Но я не могу заставить его работать, привязав его к своей собственности.

EDIT:

Я установил текст данных следующим образом:

d:DataContext="{d:DesignInstance local:ItineraryViewModel}"

Кроме того, у меня есть множество других отлично работающих данных, таких как данные для отображения и команды для кнопок. Но я просто не могу заставить триггер выполнить сюжетную линию.

Метод ShowInfocenterIfAnyItinirary() выполняется таймером, запущенным в модели представления.

Код таймера:

private readonly Timer _timer = new Timer();
public ItineraryViewModel()
{
    _timer.Interval = 5000;
    _timer.Elapsed += ShowInfocenterIfAnyItinirary;
    _timer.Start();
}

РЕДАКТИРОВАТЬ 2:

Я отложил запуск анимации при запуске программы. Я обнаружил, что анимация запускается, но только один раз. Я не видел его раньше, потому что окно начинает сворачиваться.

Почему он запускается только один раз, независимо от того, сколько раз происходит событие запуска?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я решил проблему следующим образом:

private void ShowInfocenterIfAnyItinirary(object sender, ElapsedEventArgs e)
{
    if (Items.Count <= 0) return;
    GlobalEvents.TriggerShowMainWindowEvent();
    ViewEventTrigger = "True";
    Task.Run(async () =>
    {
        Thread.Sleep(4000);
        ViewEventTrigger = "False";
    });
}

Это останавливает анимацию, вместо того, чтобы оставить ее в конечной точке.

0 голосов
/ 09 мая 2018

Это только устанавливает время разработки контекст данных:

d:DataContext="{d:DesignInstance local:ItineraryViewModel}"

Это не будет иметь никакого эффекта, когда вы действительно запустите приложение.

Вы должны установить DataContext свойство представления для экземпляра вашей модели представления:

<Window ...>
    <Window.DataContext>
        <local:ItineraryViewModel />
    </Window.DataContext>
...