2014-02-20 5 views
3

Я аа OxyPlot графика определяемого в моем XAML, как это:Невозможно обновить OxyPlot график после инициализации

<oxy:Plot Height="336"> 
    <oxy:Plot.Series> 
     <oxy:LineSeries ItemsSource="{Binding Chart}"/> 
    </oxy:Plot.Series> 
</oxy:Plot> 

В ViewModel У меня есть следующий:

public ObservableCollection<DataPoint> Chart { get; private set; } 

public MainViewModel() 
{ 
    Chart = new ObservableCollection<DataPoint>() 
      { new DataPoint(12, 14), new DataPoint(20, 26) }; 

    public void PriceChange(Model[] quotes) 
    { 
     for (int i = 0; i < quotes.Length; i++)   
     { 
      Chart.Add(new DataPoint(quotes[i].LastTradePrice, i*10));   
     } 
    } 
} 

Я вижу первоначальный Граф, нарисованный для первых двух жестко закодированных DataPoints.

Но после того, как все закончилось, и стрельба PriceChange(), новые данные не отображаются на диаграмме. Поскольку его onbervableCollection он должен автоматически уведомлять пользовательский интерфейс, не так ли? Или что мне не хватает?

BTW У меня есть следующие example по документации.

ответ

1

Несмотря на то, что ObservableCollection будет предоставлять соответствующие уведомления, я не думаю, что сам график/график обязательно будет отвечать на эти уведомления, поэтому он может не знать, что его нужно перерисовать.

Я не знаком с OxyPlot, но я быстро трещины на следующий учебник, а от быстрого сканирования Plot класса, я нашел метод, называемый InvalidatePlot(), который, кажется, чтобы заставить сюжет перекроить себя - вполне возможно, что вам нужно позвонить, если вы намерены внести изменения в данные графика. Это, безусловно, сработало, когда я попробовал это в небольшом проектном проекте.

я не нашел огромное количество примеров использования, однако эти ссылки могут помочь:

http://oxyplot.codeplex.com/discussions/398856

http://oxyplot.codeplex.com/discussions/352003

И это пример упоминается во второй из этих ссылок:

http://oxyplot.codeplex.com/SourceControl/latest#Source/Examples/WPF/WpfExamples/Examples/CoupledAxesDemo/

Edit:

Похоже предполагаемому подход вполне может создать PlotModel и связать Model свойство вашего участка к нему, вы можете уведомить об этом пользовательский интерфейс, когда PlotModel изменения:

oxyplot.codeplex.com/SourceControl/ последние # Source/Примеры/WPF/WpfExamples/Примеры/RealtimeDemo/

+0

Его довольно странно, как оно работает. Мне нужно было посмотреть пример «RefreshDemo», чтобы понять это. Это единственная демонстрационная версия, использующая многопоточность. Как они это делают, чтобы установить странный «RefreshFlag» следующим образом: ' ' для фактического обновления Это. Чувствует себя взломанным, но он работает. :) – Houman

+1

Ах, это звучит как гораздо лучший подход, вы могли бы даже назвать его ответом, хорошей работой = D – Chris

4

Вы можете сделать:

<oxy:Plot InvalidateFlag="{Binding DataPoints.Count, Delay=20}"> 
    <oxy:Plot.Series> 
     <oxy:LineSeries ItemsSource="{Binding DataPoints}"/> 
    </oxy:Plot.Series> 
</oxy:Plot> 

в вашем случае задержка не нужна, но она может быть полезна в разы.

Смежные вопросы