使用集中式数据聚合器和WPF工具包系列的最佳实现

使用集中式数据聚合器和WPF工具包系列的最佳实现,wpf,binding,charts,wpftoolkit,Wpf,Binding,Charts,Wpftoolkit,我有一个单例类DataPacketAggregator,它从通过USB连接的嵌入式设备收集数据包。数据包总是以突发方式接收。每个数据包包含传感器标识和源地址(来自ZigBee通信)。基本上,这就是DataPacket类提供的功能: public class DataPacket { public String SourceAddress {get; set;} public Byte SensorID {get; set;} public DateTime Timesta

我有一个单例类DataPacketAggregator,它从通过USB连接的嵌入式设备收集数据包。数据包总是以突发方式接收。每个数据包包含传感器标识和源地址(来自ZigBee通信)。基本上,这就是DataPacket类提供的功能:

public class DataPacket
{
    public String SourceAddress {get; set;}
    public Byte SensorID {get; set;}
    public DateTime Timestamp {get; set;}
    public Int16 Value {get; set;}
}
聚合器类提供以下基本实现:

public class DataPacketAggregator: INotifyPropertyChanged
{
    Dictionary<String, ObservableCollection<DataPacket>> _dpkts; //Container

    //Method for getting an observable collection containing only values belonging to
    //SourceAddress
    public ObservableCollection<DataPacket> GetDataBySource(String Source)
    {
        ObservableCollection<DataPacket> dpkts;
        this._dpkts.TryGetValue(Source, out dpkts);
        return dpkts;
    }
    ...
 }
公共类数据包聚合器:INotifyPropertyChanged
{
字典_dpkts;//容器
//用于获取仅包含属于的值的可观察集合的方法
//源地址
公共ObservableCollection GetDataBySource(字符串源)
{
可观测收集dpkts;
此.u dpkts.TryGetValue(源,输出dpkts);
返回dpkts;
}
...
}
因此,由于提供给TableView的所有值都已在ObservableCollection中,因此会将DataPacketAggregator中发生的任何更改通知UI。 我已经提供了一个收集数据的表格视图,但是每个传感器都会显示出来。目前,我正在将数据包存储在一个字典中,其中包含键SourceAddress和DataPacket对象的值,该值包含所接收数据包的特定数据

我现在要做的是为与从用户界面上的组合框中选择的选定SourceAddress关联的每个传感器ID创建一个单线系列图表。LineSeries应在独立轴上显示时间戳数据包数据,并在从属轴上显示值。此组合框的ItemsSource属性绑定到提供数据的字典中的可用键。关键是并非所有源都需要与之关联的相同数量的传感器,我希望根据传感器的数量动态重新创建LineSeries对象

我考虑了几种可能的实现:

  • 在已经存在的字典中嵌套另一个字典,可以快速访问属于特定传感器的值。问题是,如果希望访问完整的数据集合,则需要再次“合并”数据
  • 使用LINQ查询应用分组以获取与特定传感器关联的所有数据。我更喜欢这个解决方案,但这里有两点对我来说。第一:如何更新UI而不造成重大性能损失(一次又一次地运行所有查询)?如何通知用户界面?因为通常情况下,如果相关查询有任何更改,我只想通知UI,但我不能简单地检测到。因此,一旦添加了任何数据包(甚至与UI绘图无关),我就必须对整个UI进行更新和重画
  • 在DataAggreator中添加一个附加属性,该属性可以设置为当前相关的SourceAddress(也可以通过绑定)。我可以返回一个只有SourceAddress的ObservableCollection,并且只能查询整个数据的一个子集。此外,还可以只更新这个可观察的集合,因为这样就知道要显示哪个SourceAddress,并且我可以在不重新查询的情况下更新集合。这样做的主要缺点是,我总是被限制在显示来自单一来源的数据

  • 目前,我真的不确定该问题的最佳解决方案是什么,我也不太熟悉WPF Toolkit图表组件。

    最后,我将其实现为一个集合,由绑定到ComboBox的另一个属性触发。当SourceAddress对应于当前显示的源地址时,将触发更新。它最终是这样工作的,但主要的限制当然是只有一个源可以查看