WPF中展示动态数据的好方法是什么?

8

我在处理一个具有动态数据更新的WPF应用程序时遇到了困难。我应该使用WPF提供的丰富数据绑定吗?

在下面的讨论中,我将尽可能简化我的问题领域,并简要介绍一些解决方案。我非常感兴趣这个社区能够提供的任何意见。

简化的问题领域: 假设你有一个系统,约有1,000个项目,每个项目都有一个唯一的“名称”,以及一个动态的“速度”和“位置”。这些项目的数据每秒更新60次。您希望在各种UI中向用户显示这些数据 - 从“显示数字的标签”到图形表盘/计量表/仪表等等。WPF的完美职责 - 将视觉效果与其余应用程序分离。您将如何设计此系统?

我的第一个解决方案: 我的第一个解决方案是定义一个带有速度和位置属性(double)的对象,称为“DataItem”,定义一个带有名称属性(字符串)的接口。显示数据的控件必须实现名称接口,创建了一个“DataManager”,该管理器扫描实现接口的FrameworkElements,构建了一个包含名称/FrameworkElements对的列表初始化时间。然后,每秒60次更新1,000个DataItems的列表,并将每个匹配的FrameworkElement的DataContext设置为DataItem对象。这个解决方案有效,性能可以接受(特别是如果数据不总是改变)。

我的第二个解决方案解决了第一个解决方案中UI控件都必须实现某些接口的问题 - 恶心。我想在某些情况下使用开箱即用的未修改WPF控件。因此,第二个解决方案是定义了一个“附加属性”(我将其放在DataManager对象上),这样您就可以在xaml中执行诸如

<Label DataManager.Name = "objectname"  Content="{Binding}" />

一些解决方案似乎仍然不太对。我的第三个解决方案是尝试实现自定义的DataSourceProvider,但我没有成功。我无法理解数据源提供程序模型以及在这种情况下如何使用它。
目前,我正在查看由Microsoft Research发布的CodePlex“动态数据显示”项目。该项目专注于绘制/图形化动态数据,但其中可能会有一些想法。所以我来到了StackOverflow - 通常是一个提问简短、回答迅速的地方。 :-)
我非常新于WPF,并且希望任何人都能就这些问题提出想法。请记住,此处指定的问题域是简化的,因此我需要一个强大的解决方案。实际上有许多不同类型的数据对象,每个对象都具有不同的属性;并且数据更新的速度对于每个对象都不同,UI控件显示单个项和组项,数据来自许多来源等等。

我忘了提到绑定实际上在某些情况下是双向的,对于一些对象(UI可以控制它们)。 - Bill
很抱歉我没有答案,但这是一个好问题。我会继续关注它。WPF设计也是我仍在努力解决的问题。 - Greg D
1个回答

7
你离成功不远了。你想要在两个级别上数据绑定。
第一步 - 让你的 DataItem 实现 INotifyPropertyChanged 接口或从 DispatchingObject 派生并为每个要绑定的值实现依赖属性。
第二步 - 将所有的 DataItem 放在一个 ObservableCollection 或 DataTable 中。你需要一个支持 INotifyCollectionChanged 或 IBindingList 接口的集合。
第三步 - 使用某种容器控件(ListBox、第三方 Grid 控件等)将 DataItem 的列表绑定到你的应用程序。
第四步 - 定义一个 DataTemplate 为每个 DataItem 提供视觉效果。
第五步 - 如果需要,使用 DataTemplateSelector 动态选择不同类型的 DataItem 的 DataTemplate。
以下是一个最基本的 XAML,可以帮助你入门。
<ListBox ItemsSource="{Binding ...}" ItemTemplateSelector="{StaticResource DTSelector}">

Scott,感谢你抽出时间!我从未听说过项目模板选择器。我现在处于架构研究/原型阶段,所以我会按照你建议的路径前进一段时间。我担心每秒60次1000个项目引发“属性更改”事件作为通知机制。测试将会告诉我们结果。 - Bill
如果你实现了INotifyPropertyChanged接口,你就可以控制何时通知属性已更改。 - user1228
你肯定需要关注性能。如果使用虚拟化面板,WPF 将不会重绘那些不可见的项。 - Scott Weinstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接