2013-03-05 35 views
3

问题很简单: 基本上我的View应该显示来自WCF服务的数据。数据以高频率异步更新,因此当服务器端的数据发生更改时,应相应更新GUI。实时应用程序的MVVM设计

该视图显示了很多数据,所以基本上它绑定了ViewModel中的50/60字段。

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

现在,我写了一个“DataService”层,它与WCF服务交互,并负责根据模型更新模型到由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”处理程序的性能?

由于提前, JHON

回答

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选项,这样你就可以明确地updatesouce。

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

希望向您展示的方式。

+0

嗨达沃,非常感谢您的回答。 好的,感谢您提供Dispatcher TImer,但在这种情况下,UI上的频繁更新不是问题。 – user1070316 2013-03-05 21:23:45

+0

嗨达沃,非常感谢您的回答。 好的,谢谢你建议Dispatcher TImer,但在这种情况下UI上的频繁更新不是问题。顺便说一句,我会分开处理这个问题。 是的,我已经想到了你提出的解决方案,所以通过使用反射来将属性值转换为viewModel属性,但出于性能原因,我想避免使用反射。 这是非常有趣的关于自动映射器的建议。我会尽力调查这个方向。 谢谢, 约翰 – user1070316 2013-03-05 21:31:51

+0

有人说这个http://stackoverflow.com/a/8111631/413032方法比反射速度更快。除了我不认为反射会导致问题。绑定使用反射和1000秒的Textblock对象绑定在1秒以下http://msdn.microsoft.com/en-us/library/bb613546.aspx(呈现时间1.2sn)。当然你可以免费使用自动映射器http://www.codeproject.com/Articles/61629/AutoMapper。这真的取决于你的问题。 – 2013-03-06 07:14:13