Nano Hash - криптовалюты, майнинг, программирование

WPF MVVM - триггерная раскадровка при изменении свойства происходит только один раз

В моей модели представления у меня есть таймер, которому нужно, чтобы фон границы мигал каждые 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. Но я не могу заставить его работать, привязав его к своей собственности.

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

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

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

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

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

Код таймера:

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

ИЗМЕНИТЬ 2:

Я отложил запуск анимации при запуске программы. Я обнаружил, что анимация ДЕЙСТВИТЕЛЬНО запускается, но только один раз. Раньше не видел, потому что окно начинает сворачиваться.

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


Ответы:


1

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

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

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

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

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

2

В итоге я решил проблему так:

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

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

14.05.2018
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..