我在xaml中有这个图表:
<oxy:Plot Name="Plot" Title="Errors" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3">
<oxy:Plot.Axes>
<oxy:LinearAxis Position="Bottom" Minimum="0" Maximum="100" MajorGridlineStyle="Solid" MinorGridlineStyle="Dash" />
<oxy:LinearAxis Position="Left" Minimum="0" Maximum="100" MajorGridlineStyle="Solid" MinorGridlineStyle="Dash" />
</oxy:Plot.Axes>
<oxy:LineSeries ItemsSource="{Binding Foo}" DataFieldX="X" DataFieldY="Y" />
</oxy:Plot>
使用BackgroundWorker我做了一些魔术:
Dispatcher.BeginInvoke((Action)(() =>
{
Foo.Add(new Point() { X = Foo.Count, Y = 5 });
Plot.RefreshPlot(true);
Debug.WriteLine("Added a point...");
}));
Foo当然被定义为一个预言:
ObservableCollection<Point> Foo { get; set; }
我在构造函数中初始化它:
public MainWindow()
{
Foo = new ObservableCollection<Point>();
但仍然没有出现任何分数。我的数据绑定应该有效吗?
答案 0 :(得分:0)
我会认为你正在使用背后的代码,并从那里访问它?
我在WPF MVVM环境中运行测试,类似代码,没有Plot.RefreshPlot(true)
。
添加点似乎什么都不做,直到我放大/缩小,然后我可以看到所有点(所以它们被正确添加,但视图没有被刷新,这是有道理的,因为我无法直接访问它视图模型:)
我更喜欢在我的XAML上使用这样的代码:
<oxy:Plot Model="{Binding MyPlotModel}" ...>
并在视图模型上:
public OxyPlot.PlotModel MyPlotModel { get; set; }
然后我可以在需要时从视图模型的代码中刷新它。
上面示例的工作代码。拥有Xaml代码,并将其放入您的代码中!它会在以后快速更新:
public PlotModel MyPlotModel { get; set; }
public your_window_name()
{
InitializeComponent();
var linesSeries = new LineSeries("Random");
Random rand = new Random();
int x = 0;
this.MyPlotModel = new PlotModel();
this.MyPlotModel.Series.Add(linesSeries);
DataContext = this;
var bg_worker = new BackgroundWorker {WorkerSupportsCancellation = true};
bg_worker.DoWork += (s, e) =>
{
while (!bg_worker.CancellationPending)
{
linesSeries.Points.Add(new DataPoint(x, rand.Next(0, 10)));
x += 1;
MyPlotModel.RefreshPlot(true);
Thread.Sleep(100);
}
};
bg_worker.RunWorkerAsync();
this.Closed += (s, e) => bg_worker.CancelAsync();
}