我正在努力处理具有动态数据更新的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控件显示单个项目和项目组,数据来自多个来源等。
答案 0 :(得分:6)
你快到了。您希望在两个级别进行数据绑定。
首先 - 让您的 DataItem 实现INotifyPropertyChanged
或者从DispatchingObject
派生它们,并为要绑定到的每个值实现依赖项属性
其次 - 将所有 DataItem 保存在ObservableCollection<DataItem>
或DataTable中。您需要一个支持INotifyCollectionChanged
或IBindingList
的集合。
第三 - 使用某种容器控件(列表框,第三层网格控件等)将 DataItem 列表绑定到您的应用程序
第四 - 定义DataTemplate
为每个 DataItem 提供视觉效果
第五 - 如果需要,使用DataTemplateSelector
为不同类型的 DataItem 动态选择DataTemplate
这是一个最小的xaml来帮助你入门
<ListBox ItemsSource="{Binding ...}" ItemTemplateSelector="{StaticResource DTSelector}">