C# Oxyplot不在WPF视图中显示绘图

C# Oxyplot不在WPF视图中显示绘图,c#,wpf,plot,oxyplot,C#,Wpf,Plot,Oxyplot,我在WPF中使用OxyPlot。正在尝试在UI中显示绘图模型。 有时图形显示在UI中,有时不显示 此代码用于由后台工作人员初始化绘图模型: 视图模型: this.pm = setUpModel(); data2plot(); 使用以下方法: private PlotModel _pm; public PlotModel pm { get { return _pm; } set { _pm= value; RaisePropertyChanged("pm"); } } p

我在WPF中使用OxyPlot。正在尝试在UI中显示绘图模型。 有时图形显示在UI中,有时不显示

此代码用于由
后台工作人员初始化
绘图模型

视图模型:

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>
绑定工作正常,所以我想我的
PlotModel
一定有问题


我不知道这是否相关,但是
DataTable tbl
是由
Lazy
类(使用
isThreadSafe=true
)初始化的。

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

有时我想,它起作用的原因是视图第一次(也是唯一一次)从viewmodel中读取内容时,您已经填充了它,因此您看到了一些内容,但没有更新。

您还必须调用

pm.InvalidatePlot(true);

添加到序列后,为了触发重新绘制。

没有问题。在WPF中使用绑定集合时,您确实必须小心,但现在您知道了……不幸的是,它不起作用,我想它只是碰巧起作用。还有其他想法吗?和以前一样,有时它会显示情节,有时不会。好的,你以前用过Snoop吗?下载并安装“Snoop WPF”,然后运行应用程序,运行Snoop,然后按住Ctrl+Shift键切换应用程序中应该显示绘图的位置。您将在其中找到列出的所有属性,它将向您显示绑定是否仍然正常,或者您是否破坏了它。不,我没有,但它不再是必需的。在初始化属性之前,只需将Oxyplot.Series添加到PlotModel,问题就解决了。(我不知道为什么打电话给RaisePropertyChanged会不起作用。所以再次:谢谢你(:
pm.InvalidatePlot(true);