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 tbl
由 Lazy<T>
class(与 isThreadSafe=true
)初始化。
当您添加到 pm
成员时,pm
的值不会更新 - 更新的是该成员的内容,即永远不会调用 setter ,因此 RaisePropertyChanged 事件永远不会发出,并且视图不会收到任何更改通知。建议您建立一个本地数据集,然后在最后用完整的数据集覆盖 pm
,或者在完成后发出 RaisePropertyChanged
事件。
有时我猜它起作用的原因是视图第一次(也是唯一一次)从你已经填充它的视图模型中读取内容,所以你看到了一些东西,但随后没有更新。
您还必须致电
pm.InvalidatePlot(true);
添加到系列后,为了触发重绘。
我正在 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 tbl
由 Lazy<T>
class(与 isThreadSafe=true
)初始化。
当您添加到 pm
成员时,pm
的值不会更新 - 更新的是该成员的内容,即永远不会调用 setter ,因此 RaisePropertyChanged 事件永远不会发出,并且视图不会收到任何更改通知。建议您建立一个本地数据集,然后在最后用完整的数据集覆盖 pm
,或者在完成后发出 RaisePropertyChanged
事件。
有时我猜它起作用的原因是视图第一次(也是唯一一次)从你已经填充它的视图模型中读取内容,所以你看到了一些东西,但随后没有更新。
您还必须致电
pm.InvalidatePlot(true);
添加到系列后,为了触发重绘。