我在 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 绘制的初始图形。
但是在一切就绪并且 PriceChange() 方法被触发后,新的 DataPoint 不会绘制在图表上。因为它是一个 ObservableCollection 它应该自动通知 UI,不是吗?或者我错过了什么?
顺便说一句,我在文档中关注了这个 example

最佳答案

尽管 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 属性绑定(bind)到它,然后您可以在 PlotModel 更改时通知 UI:

oxyplot.codeplex.com/SourceControl/latest#Source/Examples/WPF/WpfExamples/Examples/RealtimeDemo/

关于wpf - 初始化后无法更新 OxyPlot 图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21914469/

10-10 11:42