4

我在我的 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,不是吗?或者我错过了什么?

顺便说一句,我在文档中遵循了这个示例

4

2 回答 2

4

你可以做:

<oxy:Plot InvalidateFlag="{Binding DataPoints.Count, Delay=20}">
    <oxy:Plot.Series>
        <oxy:LineSeries ItemsSource="{Binding DataPoints}"/>
    </oxy:Plot.Series>
</oxy:Plot>

在您的情况下,不需要延迟,但有时它可能很有用。

于 2014-06-26T18:37:48.613 回答
1

尽管ChartObservableCollection 将提供适当的通知,但我认为图表/绘图本身不一定会响应这些通知,因此它很可能不知道需要重绘它。

我对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/

于 2014-02-20T19:42:45.353 回答