WPF MVVM показывает текст метки в течение короткого времени - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть Label в строке состояния, с которой я показываю сообщения пользователю. Я хочу показать сообщение и изменить цвет фона только на несколько секунд, чтобы мне не пришлось очищать метку дополнительными строками кода.

У меня есть свойства StatusText и StatusColor в модели просмотра, и содержание и цвет метки привязаны к ним и работают нормально.

Мой вопрос: как мне рассчитать время в ViewModel?

Могу ли я использовать таймер в методе viewmodel и таким способом, который не останавливает интерфейс при отображении сообщения?

Я пытаюсь придерживаться инфраструктуры MVVM, но я не смог найти никаких решений на SO без использования событий. Возможно ли это каким-то простым способом?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Просто опубликую свое решение здесь, спасибо Луи Go за помощь.

Итак, я добавил таймер в конструкторе ВМ и следующие методы в модели представления для изменения StatusText и StatusColor свойства и поменять их обратно. Сами свойства обрабатывают уведомление об изменении.

private System.Timers.Timer timer;
private VMConstructor()
{
    timer = new System.Timers.Timer(3000);
    timer.AutoReset = false;
    timer.Elapsed += TimerTicked;
}

private void ChangeStatus(string text, string color)
{
    timer.Enabled = true;
    StatusText = text;
    StatusColor = color;
}

private void TimerTicked(object sender, EventArgs e)
{
    StatusColor = "Grey";
    StatusText = "";
}
1 голос
/ 25 февраля 2020

Использование команды вместо события. Команда найдет свойство ICommand с соответствующим именем в ViewModel. Это разделит ваш View и Code-behind.

В xaml

<Button Command="ChangeColorCommand" />

В ViewModel Примечание: timer равно System.Timers.Timer. Я пропустил его экземплярный код.

TimerTicked вызывается, когда timer Elapsed.

Вам не нужно использовать DispatcherTimer, потому что StatusText и StatusColor не являются пользовательским интерфейсом object.

    public ICommand ChangeColorCommand
    {
        get
        {
            return new RelayCommand( ChangeColorAndMessage );
        }
    }
    // This is your view model constructor
    private void ViewModelCtor(){
       // your initialize code here

        //subscribe event once
        timer = new Timer();
        timer.Interval=1000;
        timer.AutoReset=false;
        timer.Elapsed += TimerTicked;
    }

    public void ChangeColorAndMessage( string[] args )
    {
        StatusText = "Button pressed";
        StatusColor = changedColor;

        // You implementation for changing it back.
        timer.Enabled = true;
    }

    private void TimerTicked( object sender, EventArgs e )
    {
        StatusText = "origin";
        StatusColor = originColor;

        // Fire property changed to notify view updating data.
        PropertyChanged( this, new PropertyChangedEventArgs( StatusText ) );
        PropertyChanged( this, new PropertyChangedEventArgs( StatusColor ) );
    }

Для реализации RelayCommand, обратитесь к этому post

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...