1

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

但是仍然没有显示任何点。我的数据绑定应该有效吗?

4

1 回答 1

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();
}
于 2013-10-19T14:01:53.307 回答