Как создать временные всплывающие окна, используя MVVM? - PullRequest
2 голосов
/ 13 сентября 2011

Я создаю приложение Alarm на основе MVVM Light.

Основной функциональностью приложения является всплывающее сообщение о тревоге в определенное время.Я создал представление Alarm.xaml, в котором я создаю и сохраняю задачи с сигналами тревоги, класс модели Task.cs и класс модели представления AlarmViewModel.cs.

Далее я создал таймер, который каждые полминуты проверяет текущее время по списку задач:

System.Timers.Timer timer;
//I am using Timer class on purpose because I want to have asynchronous behavior 

private void InitTimer()
{
    timer = new Timer(30000); //Check every 30 seconds
    timer.Enabled = true;
    timer.Elapsed += new ElapsedEventHandler(TimerElapsed);
    timer.Start();
}

private void TimerElapsed(object sender, ElapsedEventArgs e)
{
    DateTime currentTime;
    string message;

    currentTime = e.SignalTime;
    foreach (Task task in tasks)
    {
        if (task.AlarmTime.CompareTo(currentTime) <= 0)
        {
            message = string.Format("({0}) Task:\n{1}", 
                task.AlarmTime.ToString("dd/MMM/yy HH:mm"), task.Description);
            //This message needs to pop up
        }
    }
}

У меня два вопроса:

  1. Во-первых, какое место лучше всего инициализировать и запустить таймер?Прямо сейчас два метода, написанные выше, находятся в классе AlarmViewModel.cs, но я намерен иметь более одного окна в моем приложении и, следовательно, больше моделей просмотра, и я хочу, чтобы мои проверки тревог происходили независимо от того, Alarm.xamlокно открыто или нет.Мне нужно своего рода центральное место, чтобы таймер работал до тех пор, пока приложение работает.
  2. Второй вопрос: как открыть обработчик событий string message из TimerElapsed?Я хочу создать отдельное окно / элемент управления (и соответствующую модель представления), чтобы показать описание задачи.Но как мне заставить это окно / элемент управления появиться (т.е. всплывающее окно), если я управляю всем с уровня viewmodel?Как оркестровка окон?Viewmodel locator (компонент внутри MVVM)?Как?

Спасибо за помощь.Приветствия.

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Вы можете сделать это (и многое другое) с легкостью, используя PRISM: http://compositewpf.codeplex.com/.

Для 1: Создайте модуль, который может быть загружен различными моделями представления, в качестве центральной службы, которая предлагает триггеры тревоги.При создании приложения загрузите модуль и свяжите его с моделями представления.

Для 2: PRISM поддерживает так называемые запросы взаимодействия, которые позволяют открывать диалоговые окна из модели представления в чистом виде MVVM (без нарушения однонаправленной зависимости вида от модели представления).Это работает как отправка события в пользовательский интерфейс.Пожалуйста, прочитайте руководство PRISM (также доступно по ссылке выше), чтобы найти конкретные примеры кода для достижения этой цели.

Надеюсь, что это поможет.

0 голосов
/ 14 сентября 2011

Для 1: я бы, вероятно, поместил таймер либо в приложение, либо в локатор представления. Если вы используете IoC-контейнер (например, Unity), его может быть хорошей идеей.

Для 2: вы можете увидеть этот пост для диалогов по обработке стратегий в MVVM.

...