WPF — OxyPlot — привязка к точкам данных

Я работаю над приложением WPF, которое использует OxyPlot.

Я последовал примеру. Я успешно строю диаграмму, используя следующий XAML:

<oxy:Plot Height="640" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch">
  <oxy:Plot.Series>
    <oxy:LineSeries ItemsSource="{Binding ResultSet1}" />
    <oxy:LineSeries ItemsSource="{Binding ResultSet2}" />
    <oxy:LineSeries ItemsSource="{Binding ResultSet3}" />
  </oxy:Plot.Series>
</oxy:Plot>

Моя ViewModel выглядит так:

public class MyViewModel
{
  public IList<DataPoint> ResultSet1 { get; set; }

  public IList<DataPoint> ResultSet2 { get; set; }

  public IList<DataPoint> ResultSet3 { get; set; }

  public void Load()
  {
    this.ResultSet1 = new List<DataPoint>
    {
      new DataPoint(0, 4),
      new DataPoint(40, 12),
      new DataPoint(50, 12)
    };

    this.ResultSet2 = new List<DataPoint>
    {
      new DataPoint(-0.4, 3),
      new DataPoint(8, 12),
      new DataPoint(48, 11)
    };

    this.ResultSet3 = new List<DataPoint>
    {
      new DataPoint(2, 5),
      new DataPoint(12, 14),
      new DataPoint(52, 13)
    };
  }

  public void Refresh()
  {
    this.ResultSet1 = new List<DataPoint>();
    this.ResultSet2 = new List<DataPoint>();
    this.ResultSet3 = new List<DataPoint>();
    System.Windows.MessageBox.Show("should be empty");
  }
}

В моем коде есть кнопка "Обновить". Когда пользователь нажимает на нее, я пытаюсь обновить отображаемые данные. Однако похоже, что результаты не обновляются в пользовательском интерфейсе. Я добавил MessageBox, показанный выше, чтобы убедиться, что я действительно попал в метод Refresh. Появится это окно сообщения. Итак, на данный момент я знаю:

a) Диаграмма OxyPlot работает, потому что мои начальные значения набора результатов, которые жестко запрограммированы, выглядят нормально. б) Я успешно подключил модель представления. c) Я вхожу в метод Refresh.

Я просто не уверен, почему точки на графике не обновляются. Любые идеи приветствуются!


person user70192    schedule 11.02.2016    source источник
comment
Вы должны реализовать INotifyPropertyChanged для своей модели представления; В противном случае связанная цель ItemsSource в поле зрения по-прежнему прослушивает изменения в старых объектах и ​​не узнает, что свойство заменено (указывает на новый объект после обновления).   -  person Peter    schedule 11.02.2016
comment
:). На днях я вспомню INotifyPropertyChanged. Почему-то всегда забываю. Большое спасибо за ваш ответ.   -  person user70192    schedule 11.02.2016
comment
@Peter, я думаю, ты должен написать ответ на вопрос;)   -  person FoggyFinder    schedule 12.02.2016
comment
Я всегда создаю свойство PlotModel в ViewModel и привязываю их к xaml, а затем вызываю PlotModel.InvalidatePlot(true) для этого свойства. Это отобразит график с новыми данными или, в вашем случае, не покажет никаких данных, потому что списки пусты.   -  person Sebastian Richter    schedule 25.02.2016


Ответы (1)


вместо использования IList используйте ObservableCollection

 public ObservableCollection<DataPoint> ResultSet1 { get; set; }
 public ObservableCollection<DataPoint> ResultSet2 { get; set; }
 public ObservableCollection<DataPoint> ResultSet3 { get; set; }

и вместо использования new IList<T>() используйте

ResultSet1.Clear();
ResultSet2.Clear();
ResultSet3.Clear();
person Mujahid Daud Khan    schedule 12.02.2016