用于实时应用程序的MVVM设计

时间:2013-03-05 00:11:10

标签: wpf silverlight mvvm

问题很简单: 基本上我的View应显示来自WCF服务的数据。数据以高频率异步更新,因此当服务器端的数据发生变化时,应相应地更新GUI。

View显示了大量数据,因此它基本上绑定了ViewModel中公开的50/60字段。

Model部分基本上是一个POCO对象,它包含GUI中显示的50/60个字段。是的,ViewModel将Model对象公开给View。 (请注意,Model对象实现了INotifyPropertyChanged,以便在属性值发生更改时通知View。)

现在,我写了一个" DataService"与WCF服务交互的层,它负责根据WCF服务返回的数据更新Model。在服务器端更新数据时,出于性能原因,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"处理程序?

提前致谢, JHON

1 个答案:

答案 0 :(得分:2)

你说“数据以高频率异步更新”

据我了解,您不希望对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。

提供此内容;

据我了解,您使用绑定,因此绑定具有模式和 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

希望告诉你一个方法。