我的XAML中有一个OxyPlot图表,如下所示:
<oxy:Plot Height="336">
<oxy:Plot.Series>
<oxy:LineSeries ItemsSource="{Binding Chart}"/>
</oxy:Plot.Series>
</oxy:Plot>
在viewModel中,我有以下内容:
public ObservableCollection<DataPoint> Chart { get; private set; }
public MainViewModel()
{
Chart = new ObservableCollection<DataPoint>()
{ new DataPoint(12, 14), new DataPoint(20, 26) };
public void PriceChange(Model[] quotes)
{
for (int i = 0; i < quotes.Length; i++)
{
Chart.Add(new DataPoint(quotes[i].LastTradePrice, i*10));
}
}
}
我可以看到为最初的两个硬编码DataPoints绘制的初始图形。
但是在一切都结束并且PriceChange()
方法被触发后,新的DataPoints不会在图表上绘制。由于它的onbervableCollection它应该自动通知UI,不是吗?或者我错过了什么?
BTW我在文档中遵循了这个example。
答案 0 :(得分:4)
你可以这样做:
<oxy:Plot InvalidateFlag="{Binding DataPoints.Count, Delay=20}">
<oxy:Plot.Series>
<oxy:LineSeries ItemsSource="{Binding DataPoints}"/>
</oxy:Plot.Series>
</oxy:Plot>
在你的情况下,不需要延迟,但它有时很有用。
答案 1 :(得分:1)
虽然Chart
ObservableCollection将提供适当的通知,但我认为图表/图表本身不一定会响应这些通知,因此可能不知道它需要重新绘制。
我不熟悉OxyPlot,但我快速破解了一个教程,通过对Plot
类的快速扫描,我发现了一个名为InvalidatePlot()
的方法,似乎强制绘图重绘 - 如果您打算更改绘图数据,可能需要调用它。当我在一个小样本项目中尝试它时,它肯定有效。
我没有找到大量的示例用法,但这些链接可能有所帮助:
http://oxyplot.codeplex.com/discussions/398856
http://oxyplot.codeplex.com/discussions/352003
这是第二个链接中提到的例子:
编辑:
看起来预期的方法可能是创建PlotModel
并将绘图的Model
属性绑定到它,然后您可以在PlotModel
更改时通知UI:
oxyplot.codeplex.com/SourceControl/latest#Source/Examples/WPF/WpfExamples/Examples/RealtimeDemo /