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

时间:2008-12-13 16:16:38

标签: wpf data-binding

我正在努力处理具有动态数据更新的WPF应用程序的最佳方法。我应该使用WPF提供的丰富数据绑定吗?

我将在下面的讨论中尽可能简化我的问题域,并简要提及一些解决方案。我对这个社区可以提供的任何评论都非常感兴趣。

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

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

我的第二个解决方案解决了第一个解决方案中的UI控件都必须实现某些接口的问题 - yuk。我想使用开箱即用的未经修改的WPF控件(在某些情况下)。所以,第二个解决方案是定义一个“附加属性”(我把它放在DataManager对象上),所以你可以 - 在xaml中 - 做类似的事情

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

不知何故,这个解决方案似乎仍然不对。我的第三个解决方案是研究实现自定义DataSourceProvider。我没有成功。我无法理解数据源提供程序模型,以及在这种情况下如何使用它。

目前,我正在研究Microsoft Research发布的CodePlex“动态数据显示”项目。该项目完全是关于绘制/绘制动态数据的,但可能会有一些想法。所以我在StackOverflow上 - 通常是一个简短问题和快速答案的地方。 : - )

我是WPF的新手,非常感谢任何人对这些问题的看法。请记住,此处指定的问题域已经简化,因此我需要一个强大的解决方案。实际上有许多不同类型的数据对象,每个对象具有不同的属性;和数据更新对于每个对象的速率不同,UI控件显示单个项目和项目组,数据来自多个来源等。

1 个答案:

答案 0 :(得分:6)

你快到了。您希望在两个级别进行数据绑定。

首先 - 让您的 DataItem 实现INotifyPropertyChanged或者从DispatchingObject派生它们,并为要绑定到的每个值实现依赖项属性

其次 - 将所有 DataItem 保存在ObservableCollection<DataItem>或DataTable中。您需要一个支持INotifyCollectionChangedIBindingList的集合。

第三 - 使用某种容器控件(列表框,第三层网格控件等)将 DataItem 列表绑定到您的应用程序

第四 - 定义DataTemplate为每个 DataItem 提供视觉效果

第五 - 如果需要,使用DataTemplateSelector为不同类型的 DataItem 动态选择DataTemplate

这是一个最小的xaml来帮助你入门

<ListBox ItemsSource="{Binding ...}" ItemTemplateSelector="{StaticResource DTSelector}">