Oxyplot 不在 WPF 视图中显示绘图

Oxyplot does not display plots in WPF view

我正在 WPF 中使用 OxyPlot。尝试在 UI 中显示 PlotModels。 有时情节显示在 UI 中,有时不显示。

此代码用于通过 BackgroundWorker:

初始化 PlotModel

视图模型:

this.pm = setUpModel();
data2plot();

使用方法:

private PlotModel _pm;
public PlotModel pm
{
     get { return _pm; }
     set { _pm= value; RaisePropertyChanged("pm"); }
}


private PlotModel setUpModel()
{
      PlotModel pm = new PlotModel();
      pm.IsLegendVisible = false;
      var xAxis= new CategoryAxis();          
      pm.Axes.Add(xAxis);
      var valueAxis = new LinearAxis();            
      pm.Axes.Add(valueAxis);
      return pm ;
}

//tbl holds the data in the second column
private void data2plot(DataTable tbl)
{
       var series = new OxyPlot.Series.LineSeries();
       int i = 0;
       foreach (DataRow row in tbl.Rows)
       {
             double val = double.Parse(row[1].ToString());
             series.Points.Add(new DataPoint(i, val));
             i++;
       }

       this.pm.Series.Add(series);
}

视图中用于初始化模型的代码:

<Grid HorizontalAlignment="Left" Height="205" Margin="10,117,0,0" VerticalAlignment="Top" Width="308">
       <oxypl:PlotView x:Name="plot" Model="{Binding pm,UpdateSourceTrigger=PropertyChanged}"  Margin="10" Grid.Row="1">
       </oxypl:PlotView>
</Grid>

具有以下参考文献

xmlns:oxypl="http://oxyplot.org/wpf"
DataContext="{Binding Source={StaticResource Locator}, Path=ViewModel}"

绑定有效,所以我想我的 PlotModel 一定有问题。

我不知道这是否相关,但是 DataTable tblLazy<T> class(与 isThreadSafe=true)初始化。

当您添加到 pm 成员时,pm 的值不会更新 - 更新的是该成员的内容,即永远不会调用 setter ,因此 RaisePropertyChanged 事件永远不会发出,并且视图不会收到任何更改通知。建议您建立一个本地数据集,然后在最后用完整的数据集覆盖 pm,或者在完成后发出 RaisePropertyChanged 事件。

有时我猜它起作用的原因是视图第一次(也是唯一一次)从你已经填充它的视图模型中读取内容,所以你看到了一些东西,但随后没有更新。

您还必须致电

pm.InvalidatePlot(true);

添加到系列后,为了触发重绘。