【问题标题】:Can't update OxyPlot graph after initialisation初始化后无法更新 OxyPlot 图
【发布时间】: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

【问题讨论】:

    标签: wpf oxyplot


    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2020-08-06
      相关资源
      最近更新 更多