初始化后无法更新 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));          
        
    

我可以看到为最初的两个硬编码DataPoints 绘制的初始图形。

但是在一切就绪并且PriceChange() 方法被触发之后,新的DataPoints 并没有绘制在图表上。因为它是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 像这样:&lt;o:Plot RefreshFlag="Binding Refresh"&gt; &lt;o:LineSeries ItemsSource="Binding Points"/&gt; &lt;/o:Plot&gt; 来实际刷新它。感觉很hacky,但它有效。 :) 啊,这听起来像是一个更好的方法,你甚至可以把它作为答案,干得好=D

以上是关于初始化后无法更新 OxyPlot 图的主要内容,如果未能解决你的问题,请参考以下文章

从另一个线程更新 oxyplot 模型

OxyPlot 无法在 Xamarin Forms UWP 中呈现

OxyPlot 未在 Xamarin 表单中显示

更新后无法启动嵌套项目/停止在 Typeorm 依赖项初始化

更新到 xcode 7 后出错:无法使用类型参数列表调用类型“NSRegularExpression”的初始化程序

更新到 ASP.NET Core 2 后无法获取配置部分