C# 具有持续更新数据的MVVM

C# 具有持续更新数据的MVVM,c#,windows-store-apps,simple-mvvm,C#,Windows Store Apps,Simple Mvvm,我目前正在开发一个Windows应用商店应用程序(8.1),该应用程序应执行以下操作: 与USB HID设备对话(解决了这个问题) 显示来自该设备的数据(我想使用Oxyplot显示该数据,明白了) 使用MVVM(我选择了SimpleMVVM工具包,因为它已经有VS2013的模板) 创建一个模拟数据提供程序,生成随机数据并将其提供给我的ViewModel 现在我有点被困在这里,关于数据放在哪里。我使用队列存储我的值(我总是希望显示最后100个值)。现在,我应该在模型中输入什么,在ViewMod

我目前正在开发一个Windows应用商店应用程序(8.1),该应用程序应执行以下操作:

  • 与USB HID设备对话(解决了这个问题)
  • 显示来自该设备的数据(我想使用Oxyplot显示该数据,明白了)
  • 使用MVVM(我选择了SimpleMVVM工具包,因为它已经有VS2013的模板)
  • 创建一个模拟数据提供程序,生成随机数据并将其提供给我的ViewModel
现在我有点被困在这里,关于数据放在哪里。我使用队列存储我的值(我总是希望显示最后100个值)。现在,我应该在模型中输入什么,在ViewModel中输入什么

例如,我会将包含数据点的队列放入我的ViewModel中吗?如何正确触发“每1秒获取一些数据”的过程。我考虑使用System.Threading.Threads.Timer来实现这一点。我该把它放在哪里?进入MockDataServiceAgent?在这种情况下:如何从ServiceAgent访问ViewModel以执行更新


如果你有按钮之类的东西,一切都很好,但是如果你有随机事件,而这些事件实际上是由视图之外的“其他东西”触发的呢

您可以将包含数据的队列作为
可观察集合
放在
视图模型中,然后当
可观察集合
更改时,它可以更新它绑定到的任何内容。最好保持
ServiceAgent
ViewModel
之间的链接松散耦合,我建议使用
SimpleMvvm
的消息传递系统,如果它有消息传递系统,我知道
MvvmLight
(另一个Mvvm工具包)有消息传递系统。或者您可以使用中介模式自己构建一个。或者,如果您不想使用中介,请使用IoC容器。只需让您的数据服务进程更新
可观察的收集
,就可以消除对事件的担忧(用于更新UI)。

您的
模型
是您的
域对象
,它代表您正在处理的实际
数据
信息。
车型
的一个例子可能是
汽车
包含
品牌
车型
颜色
等。这里的主要问题是
车型
维护的是
信息
,而不是行为

ViewModel
是您的
表示分离
层,它可以包装一个或多个
模型
对象。它是
视图
模型
之间的粘合剂,公开了维护
视图
状态的命令和方法,并且可以由于
视图
上的
操作
而改变
模型
的状态

您的
数据
应由您的
型号
型号
维护。它将是您的
ViewModel
,它将公开
数据
,并为您的
视图
提供使用它的机制。
observedcollection
是一种常见的机制,用于将
数据的集合
公开给
视图
,因为它是动态的,并在添加、删除或完全刷新项目时提供通知


理想情况下,你不希望你的对象有很强的链接,所以为了在对象之间进行通信,你可能需要考虑。大多数MVVM框架都有一些实现,可以作为
中介
事件聚合器
消息总线。它们提供了一种
publish
subscribe
机制,其中一个对象
发布包含一些数据的通知,一个或多个
subscribed
对象将接收该通知并相应地处理数据。所涉及的对象都不知道谁是
发布者
订阅者
或者谁是所涉及的对象,他们只知道
中介
实现。

感谢您的回复。我明白,在我的情况下,我应该在我的ViewModel中保留ObservalEQUEUE(我实现了一个ObservalEQUEUE,它是一个添加了通知的队列)。数据本身(数据点类)存储在模型中。我发现SimpleMVVM也有某种中介模式可用(RegisterToReceiveMessages、SendMessage)。有一件事我还不明白,那就是我应该把伪造或检索真实数据的计时器放在哪里。我是否也应该将其放入ViewModel中,然后从MockDataPointServiceAgent获取数据?@TomL。您的
MockDataPointServiceAgent
负责提供您使用的
数据,因此我会将
计时器
放在那里,然后使用
中介
mecahnism来
发布
数据。通知其他人新数据可用通常比轮询更好,因为您可能轮询100次,但只获得1次新数据。当我偶然发现ServiceAgent不是从ViewModelBase(包含中介模式函数)派生出来时,我首先要做的就是这样。现在我必须从ViewModelBase派生ServiceAgent,我发现它不是很干净。@TomL。我明白你的困惑,同意你的看法,这似乎不干净。如果您愿意的话,构建自己的
中介器
实现并不太复杂。@TomL。另一种选择是,让您的
ViewModel
构造函数需要实现
IDataPointServiceAgent
,它公开了一个
EventHandler
委托,您的
ViewModel
可以直接挂接该委托以进行数据
推送
通知。这意味着您的
ViewModel
依赖于
IDataPointServiceAgent
,但这在您的实现中可能是可以接受的。谢谢您的评论。如果你是我,你会把检索数据(或伪造数据)的计时器放在哪里?我会把它放在哪里