积分未显示在我的图表上

时间:2013-10-16 06:59:24

标签: c# wpf oxyplot

我在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>();

但仍然没有出现任何分数。我的数据绑定应该有效吗?

1 个答案:

答案 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();
}