如何使用MVVM创建定时弹出窗口?

时间:2011-09-13 19:26:00

标签: wpf mvvm mvvm-light

我正在创建一个基于MVVM Light的Alarm应用程序。

该应用程序的主要功能是在特定时间弹出警报消息。 我创建了一个视图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类中,但我打算在我的应用程序中有多个窗口,因此有更多的视图模型,我希望我的警报检查能够发生,无论{是否{ {1}}窗口是否打开。只要应用程序运行,我需要一种中心位置来保持计时器运行。
  2. 第二个问题是如何弹出Alarm.xaml string message事件处理程序?我想创建一个单独的窗口/控件(和相应的viewmodel)来显示任务描述。但是,如果我从viewmodel层控制所有内容,我如何使该窗口/控件出现(即弹出)?如何编排窗户? Viewmodel定位器(MVVM中的一个组件)?怎么样?
  3. 感谢所有帮助。干杯。

2 个答案:

答案 0 :(得分:1)

您可以使用PRISM轻松完成此操作(以及更多内容):http://compositewpf.codeplex.com/

For 1:创建一个可以由不同视图模型加载的模块,作为提供警报触发器的中央服务。在编写应用程序时,加载模块并将其与视图模型绑定。

For 2:PRISM支持所谓的交互请求,允许您以MVVM纯方式从视图模型中弹出对话框(不违反视图模型上视图的单向依赖性)。它的工作方式类似于发送到UI的事件。请阅读PRISM指南(也可在上面的链接中找到),以找到实现此目的的具体代码示例。

希望有所帮助。

答案 1 :(得分:0)

对于1:我可能将计时器放在应用程序或视图定位器中。如果您使用IoC容器(例如Unity)放置它可能是个好主意。

For 2:你可以看到this post用于MVVM中的策略处理对话框。