C# 具有持续更新数据的MVVM
我目前正在开发一个Windows应用商店应用程序(8.1),该应用程序应执行以下操作: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
- 与USB HID设备对话(解决了这个问题)
- 显示来自该设备的数据(我想使用Oxyplot显示该数据,明白了)
- 使用MVVM(我选择了SimpleMVVM工具包,因为它已经有VS2013的模板)
- 创建一个模拟数据提供程序,生成随机数据并将其提供给我的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
,但这在您的实现中可能是可以接受的。谢谢您的评论。如果你是我,你会把检索数据(或伪造数据)的计时器放在哪里?我会把它放在哪里