我已经构建了一个心率监测设备,打算从该设备将数据发送到移动应用程序。
在我的移动应用程序中,我想将心电图显示为动态曲线,并根据设备发送给它的实时数据进行更新。
当前,我虽然很担心准备准备添加到图形中的数据,因此,我编写了一个代码,该代码从外围设备读取数据并将其添加到可观察的集合中:< / p>
MyDevice.Characteristic.ValueUpdated += (sender, e) =>
{
HrData = new ObservableCollection<string>();
HrData.Add(System.Text.Encoding.Default.GetString(e.Characteristic.Value));
};
现在,由于设备正在很小的时间内读取大量数据,因此我打算在图中仅显示20个数据点,这意味着应根据FIFO原理更新列表。
我知道,我可以做一个循环并移动集合中的每个实体,从而实现原理。但是,我确实认为这将是一种“无情”的方式。
答案 0 :(得分:2)
我认为您从根本上寻找的是队列。队列是先进先出机制(与堆栈相反,后者是先进先出机制)。
答案 1 :(得分:0)
ObservableCollection
不支持这种情况。您可以做什么:
创建自己的INotifyCollectionChanged
或:子类ObservableCollection
,在更新内容时挂起通知,然后引发Reset
事件
或:每次重新创建集合
或:创建两个单独的集合,并在它们之间切换:在更新B时公开A,然后在更新A时公开B
答案 2 :(得分:0)
class ObservableQueue<T> : Queue<T>, INotifyCollectionChanged
{
public ObservableQueue()
{
}
public ObservableQueue(int capacity) : base(capacity)
{
}
public ObservableQueue(IEnumerable<T> collection) : base(collection)
{
}
public event NotifyCollectionChangedEventHandler CollectionChanged;
public new void Clear()
{
base.Clear();
if(this.CollectionChanged != null)
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public new void Enqueue(T item)
{
base.Enqueue(item);
if (this.CollectionChanged != null)
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add));
}
public new T Dequeue()
{
T item = base.Dequeue();
if (this.CollectionChanged != null)
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove));
return item;
}
}