初始化后无法更新 OxyPlot 图
Posted
技术标签:
【中文标题】初始化后无法更新 OxyPlot 图【英文标题】:Can't update OxyPlot graph after initialisation 【发布时间】:2014-03-21 18:56:40 【问题描述】:我的 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));
我可以看到为最初的两个硬编码DataPoint
s 绘制的初始图形。
但是在一切就绪并且PriceChange()
方法被触发之后,新的DataPoint
s 并没有绘制在图表上。因为它是ObservableCollection
,它应该自动通知 UI,不是吗?或者我错过了什么?
顺便说一句,我在文档中关注了这个example。
【问题讨论】:
【参考方案1】:你可以这样做:
<oxy:Plot InvalidateFlag="Binding DataPoints.Count, Delay=20">
<oxy:Plot.Series>
<oxy:LineSeries ItemsSource="Binding DataPoints"/>
</oxy:Plot.Series>
</oxy:Plot>
在您的情况下,不需要延迟,但有时它可能很有用。
【讨论】:
【参考方案2】:虽然Chart
ObservableCollection 将提供适当的通知,但我认为图表/绘图本身不一定会响应这些通知,因此它很可能不知道需要重绘。
我对 OxyPlot 不熟悉,但我在遵循教程时快速破解,并且通过快速浏览 Plot
类,我发现了一个名为 InvalidatePlot()
的方法,这似乎迫使情节重绘本身 - 如果您打算更改绘图数据,您可能需要调用它。当我在一个小型示例项目中尝试它时,它确实有效。
我没有找到大量的示例用法,但是这些链接可能会有所帮助:
http://oxyplot.codeplex.com/discussions/398856
http://oxyplot.codeplex.com/discussions/352003
这是第二个链接中提到的示例:
http://oxyplot.codeplex.com/SourceControl/latest#Source/Examples/WPF/WpfExamples/Examples/CoupledAxesDemo/
编辑:
看起来预期的方法很可能是创建一个 PlotModel
并将您的绘图的 Model
属性绑定到它,然后您可以在 PlotModel
更改时通知 UI:
oxyplot.codeplex.com/SourceControl/latest#Source/Examples/WPF/WpfExamples/Examples/RealtimeDemo/
【讨论】:
这很奇怪,它是如何工作的。我需要查看RefreshDemo
示例才能弄清楚。它是唯一使用多线程的演示。他们如何做到这一点是设置一个奇怪的RefreshFlag
像这样:<o:Plot RefreshFlag="Binding Refresh"> <o:LineSeries ItemsSource="Binding Points"/> </o:Plot>
来实际刷新它。感觉很hacky,但它有效。 :)
啊,这听起来像是一个更好的方法,你甚至可以把它作为答案,干得好=D以上是关于初始化后无法更新 OxyPlot 图的主要内容,如果未能解决你的问题,请参考以下文章
OxyPlot 无法在 Xamarin Forms UWP 中呈现
更新后无法启动嵌套项目/停止在 Typeorm 依赖项初始化