wpf - 实时应用程序的 MVVM 设计

标签 wpf silverlight mvvm

问题很简单: 基本上我的 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/

相关文章:

Java 相当于 WPF 的 3D 功能

c# - 相当于绘图应用程序的橡皮擦、c#、silverlight、wp7

c# - OpenFileDialog.ShowDialog() 在 Silverlight 中引发 InvalidOperationException

wpf - 在基于 MVVM 的应用程序中导航

c# - 使用 Fody [ImplementPropertyChanged] 时出错

c# - 沿 XAML Shapes.Path 获取点

wpf - 将 Prism 区域管理与 WPF 导航服务集成的最佳方式是什么?

silverlight - 无法调试通过 VS 2010 运行的 Silverlight 应用程序

wpf - MVVM:如果后台线程不断更改模型怎么办?

c# - 如何在双击时将当前选定的 DataGridView 项目发送到 ViewModel 中的命令