Я пишу программу, использующую WPF в VS2017, которая рисует график цены акций. Я использовал диаграмму с CandleStickSeries, которая наследуется от BubbleSeries из System.Windows.Controls.DataVisualization.Charting.
<Grid Name="maingrid">
<Grid.Resources>
<local:CandleStickViewModelCollection x:Key="StockDataCollection" />
</Grid.Resources>
<charting:Chart Name="chartInfo">
<local:CandleStickSeries x:Name="candlesticks"
Title="{Binding ElementName=Symbol, Path=Text}"
DataPointStyle="{StaticResource CandleStick}"
DependentValueBinding="{Binding Path=high}"
IndependentValuePath="datetime"
ItemsSource="{DynamicResource StockDataCollection}"
SizeValueBinding="{Binding Path=WickHeight}" />
<charting:Chart.Axes>
<!-- Axis for custom labels -->
<charting:DateTimeAxis Orientation="X">
<charting:DateTimeAxis.AxisLabelStyle>
<Style TargetType="charting:DateTimeAxisLabel">
<Setter Property="StringFormat" Value="{}{0:d}" />
</Style>
</charting:DateTimeAxis.AxisLabelStyle>
</charting:DateTimeAxis>
</charting:Chart.Axes>
</charting:Chart>
На странице имеются элементы управления, которые позволяют пользователю выбирать начальный и конечный индексы в списке списка акций и отображать только свечи из нужного диапазона. И у меня есть кнопка, которую вы нажимаете, чтобы увеличить конечный индекс на 1, чтобы вы могли шагать по истории цен.
private void StepForward_Click(object sender, RoutedEventArgs e)
{
var candles = maingrid.Resources["StockDataCollection"] as CandleStickViewModelCollection;
int i = ++candles.EndIndex;
EndCandle.Text = i.ToString();
}
EndIndex - это свойство, которое при установке вызывает функцию Initialize (), которая очищает текущие данные графика и добавляет новый диапазон данных на диаграмму.
public CandleStickViewModelCollection Initialize()
{
Clear();
if (candleSticks != null)
for (int ii = StartIndex - 1; ii < EndIndex; ii++)
{
Add(candleSticks[ii]);
}
return this;
}
Это отлично работает для нескольких кликов, затем точки данных перестают очищаться, и график начинает добавлять новые свечи поверх старых. Когда я проверяю счетчик ItemsSource, это правильная сумма, однако, когда я смотрю на Live Visual Tree, я вижу, что количество свечей продолжает увеличиваться, не стирая старые. В этом фрагменте вы можете увидеть PlotArea, отображающее 1650 элементов, но оно должно быть только 550. Оно показывает в три раза больше, чем должно
Что может быть причиной и как я могу это исправить?