USB 経由で接続された組み込みデバイスから DataPackets を収集するシングルトン クラス DataPacketAggregator があります。パケットは常にバーストで受信されます。すべての DataPacket には、Sensor Identification と Source Address (ZigBee Communication から来る) が含まれています。基本的に、それは DataPacket クラスが提供するものです:
public class DataPacket
{
public String SourceAddress {get; set;}
public Byte SensorID {get; set;}
public DateTime Timestamp {get; set;}
public Int16 Value {get; set;}
}
Aggregator クラスは、次の基本的な実装を提供します。
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;
}
...
}
したがって、TableView に提供されるすべての値は既に ObservableCollection 内にあるため、UI は DataPacketAggregator で行われている変更について通知されます。収集されたデータのテーブル ビューを既に提供していますが、そこにはすべてのセンサーが表示されています。現時点では、キー SourceAdress と、受信した DataPacket に固有のデータを含む DataPacket-Object の値を使用して、DataPacket をディクショナリに格納しています。
ここでやりたいことは、ユーザー インターフェースの ComboBox から選択された SourceAddress に関連付けられた各センサー ID に対して 1 行の系列グラフを作成することです。LineSeries は、独立軸にタイムスタンプの DataPacket データを表示し、従属軸に値を表示します。この ComboBox の ItemsSource プロパティは、データを提供するディクショナリで使用可能なキーにバインドされます。ポイントは、すべてのソースに同じ量のセンサーが関連付けられている必要はなく、センサーの量に応じて LineSeries オブジェクトを動的に再作成したいということです。
可能ないくつかの実装について考えました。
- 特定のセンサーに属する値にすばやくアクセスできるように、既存のディクショナリ内に別のディクショナリをネストします。問題は、データの完全なコレクションにアクセスしたい場合、データを再度「マージ」する必要があることです。
- 特定のセンサーに関連付けられたすべてのデータを取得するには、LINQ クエリを使用してグループ化を適用します。私はこの解決策を好みますが、ここには2つのポイントがあります。最初:パフォーマンスを大幅に低下させずにUIを更新する方法(すべてのクエリを何度も実行する)? UI に通知する方法 通常、関連するクエリに変更があった場合に UI に通知したいだけですが、それを単純に検出することはできません。そのため、DataPacket が追加されるとすぐに UI 全体の更新と再描画を行う必要があります (UI 描画に関係なくても)。
- 現在関連する SourceAddress に設定できる DataAggreagtor 内に追加のプロパティを追加します (これもバインディングを介して)。SourceAddress のみを持つ ObservableCollection を返すことができ、データ全体のサブセットに対してのみクエリを実行できます。さらに、この観察可能なコレクションだけを更新することも可能です。これは、どの SourceAddress を表示するかがわかっているため、再クエリを実行せずにコレクションを更新できるからです。これの主な欠点は、常に単一のソースからのデータを表示するように制限されることです。
現時点では、この問題に対する最善の解決策は何か確信が持てず、WPF Toolkit Charting Component についてもあまり詳しくありません。