我正在VS2017中使用WPF编写一个程序,该程序绘制了股价的烛台图。我使用了一个带有CandleStickSeries的图表,该图表继承自System.Windows.Controls.DataVisualization.Charting的BubbleSeries。
<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上的计数时,它是正确的数量,但是当我查看实时可视树时,我看到烛台的数量不断增加,而没有清除旧的烛台。在此片段中,您可以看到PlotArea显示1650个项目,但它只能是550个。它显示的是应有的三倍
可能是什么原因导致的,我该如何解决?