问题很简单: 基本上我的 View 应该显示来自 WCF 服务的数据。数据异步更新频率高,因此当服务器端数据发生变化时,GUI应该相应更新。
View 显示了大量数据,因此基本上它绑定(bind)了 ViewModel 中公开的 50/60 个字段。
模型部分基本上是一个 POCO 对象,其中包含 GUI 中显示的 50/60 字段。是的,ViewModel 将 Model 对象暴露给 View。 (请注意,Model 对象实现了 INotifyPropertyChanged,以便在属性值更改时通知 View。)
现在,我编写了一个与 WCF 服务交互的“DataService”层,它负责根据 WCF 服务返回的数据更新模型。当数据在服务器端更新时,出于性能原因,WCF 服务仅将更改的字段集返回给客户端。
因此,在 DataService 中有一个事件处理程序来管理 wcf 服务更新,如下所示:
void OnServiceUpdated(UpdateArgs args)
{
foreach(Field field in args.ChangedFields)
{
if(field.Key == "BetName") _modelBet.BetName = field.Value;
else if(field.Key == "BetUser") _modelBet.BetUser = field.Value;
[...]
//the same for 50 fields...
}
}
现在需要更新模型的可怕代码,因为我们只想更新服务器端未更改的模型字段。 (请注意,wcf 服务 API 不能更改)。
我的问题是:为了提高“OnServiceUpdated”处理程序的性能,您有什么建议?
提前致谢, 强
最佳答案
你说“数据是高频异步更新的”
据我了解,您不希望频繁影响 UI。因此,您可以使用调度程序计时器进行延迟通知。它在 UI 线程上工作,与其他计时器不同。
http://msdn.microsoft.com/tr-tr/library/system.windows.threading.dispatchertimer.aspx 这是 SO 用户的回答 https://stackoverflow.com/a/15044392/413032关于它。
如果您使用 MVVM,那么如果我是您,我会让 args.ChangedFields 名称和我的 ViewModel 属性名称相等。因此,通过反射 或使用自动映射器,我可以将属性值传输到 viewModel 属性。
您也可以在所有属性设置后引发事件并更新UI。
为了提供这个;
据我所知,您使用 binding,因此绑定(bind)具有模式和 updatesourcetrigger 选项,因此您可以显式更新源。
http://msdn.microsoft.com/en-us/library/cc278072(v=vs.95).aspx#updating_the_data_source http://msdn.microsoft.com/en-us/library/system.windows.data.updatesourcetrigger.aspx
希望能告诉你一个方法。
关于wpf - 实时应用程序的 MVVM 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213542/