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