0

这个主题可能看起来很广泛,但我正在寻找数据驱动应用程序的适当架构和 WPF 技术的概述。

我正在构建一个连接到 Access 数据库的数据密集型应用程序。在任何给定时间,屏幕上都有多个数据视图,并且它们都会随着用户选择与任何视图交互而动态更新。其中一个视图是 3D 地图。其他视图包括几个图形 (D3)、一个数据网格和一个画布,我使用矩形和圆形在其上以编程方式绘制数据(在我的画布中覆盖 OnRender)。

我目前的数据模型只是我的第一次尝试,而且看起来很慢。基本上,当用户与画布交互时,会向 Access 数据库发送一个新查询,该数据库返回一组新数据以在所有视图中绘制(使用 OleDBDataAdapter)。这很慢。特别是在放大和缩小画布时。

我希望能够与数据库实时交互,并在所有视图中绘制数据而没有任何延迟。如果 WPF 无法实现这种应用程序,最好早点知道这一点。但我认为我只是做错了事。

所以我希望有人以前解决过这种问题,并且可以帮助我朝着正确的方向前进。

4

2 回答 2

1

我开始这个项目已经快两年了。我们聘请了一位新的 WPF 开发人员来帮助我以正确的方式启动它,从那时起,它已成为我公司最成功的软件项目之一。在了解了我所学的内容之后,我现在知道如何正确回答我自己的问题。所以这个答案适用于两年前的我,其他人刚开始 WPF 项目,不知道他们在做什么。

我对MVVM一无所知在开始这个项目之前,事实上,当我第一次提出这个问题时,甚至没有人向我提及这一点。这对于任何 WPF 项目都是必须的。如果您虔诚地遵循它,它将使您的代码库井井有条且可测试。

对于我的项目,模型是与数据库对话的层。最初的计划是让数据库始终保持打开状态,并在需要数据时不断查询。最后,数据量太小了,我们只是将其加载到内存中并关闭数据库。无论您如何与数据交互,程序的其余部分都不关心数据的来源。它只是向模型询问数据,然后提供服务。

ViewModel是每个 UI 部分的后端。例如,如果我正在显示一个图表,则 ViewModel 是包含需要在该图表上显示的数据的对象。ViewModel 与 Model 对话以获取它需要的信息。这是用 C# 编写的。

观点_是包含图形的 UI 组件这是用 XAML 编写的,并使用数据绑定与 ViewModel 保持同步/通信。数据绑定是整个 MVVM 模式的关键。

一个简单的数据可视化程序可能有 10 个不同的视图,每个视图都有自己的视图模型。(我建议将每个视图和视图模型放在各自单独的文件中。事实上,我建议将您的整个项目分成几个较小的项目:一个用于 UI(所有 XAML 文件),一个用于 ViewModel(C# 后端代码),一个用于模型(数据层,可能是 C#),另一个用于通用实用程序等)

就数据可视化而言,我们最终使用了 Visiblox,因为它的速度和易用性。Visiblox 图包含在它们各自的视图中,数据绑定到视图模型。除了 Visiblox 的东西,我们还使用了 DataGrids 和标准输入/输出控件。它们都只是用于显示数据的 UI 组件。

这种架构的好处是 ViewModel 简单地表示数据,而 View 表示该数据的可视化。它们彼此完全分离,这使得单元测试变得轻而易举。

我建议使用现有的 MVVM 框架之一,或者像我们一样编写自己的框架。

显然,有一本教科书的信息可以添加到这个答案中。这是对 MVVM 工作原理的简化解释,以及两年前我将如何回答自己的问题。

于 2014-03-17T17:23:03.023 回答
0

我怀疑您当前正在做的是运行一个新查询,然后根据数据创建新的“视图模型”对象,这随后会导致使用数据模板创建新的视觉元素。随着您增加数据集的大小并增加可视化的复杂性,这可能会变得相当缓慢。

假设您的查询返回具有一致结构的数据(在每次查询之后以几乎相同的方式建模),您可能能够保留对象结构,因此仅更改视图模型的属性,而不是构造一个全新的对象每次的层次结构。这要快得多,但需要您做一些中间工作来根据查询结果更新您的视图模型,而不是简单地为查询结果创建一个全新的视图模型。

详细信息将非常针对您的特定问题。也有可能我完全误解了你在做什么。

于 2012-05-22T19:03:09.723 回答