void IRequireDataSourceUpdates.Add(IChartRenderContext icrc, int startAt, IList items) { // mimic the DSRP sequence var widx = LabelStyle?.Find(FrameworkElement.WidthProperty); var bl = new BindingEvaluator(LabelPath); // keep a separate list; easier at the end var reproc = new List <ItemState>(); for (int ix = 0; ix < items.Count; ix++) { // add requested item var label = bl.For(items[ix]); var istate = makeit(startAt + ix, label, widx == null); AxisLabels.Insert(startAt + ix, istate); reproc.Add(istate); } // re-sequence remaining items for (int ix = startAt + reproc.Count; ix < AxisLabels.Count; ix++) { AxisLabels[ix].index = ix; AxisLabels[ix].value = ix; } // render new items // run the element pipeline on the added items var recycler = new Recycler <FrameworkElement, ItemState>(CreateElement); var labels = new List <ICategoryLabelState>(AxisLabels); var sc = new SelectorContext(this, icrc.SeriesArea, labels); foreach (var istate in reproc) { ElementPipeline(sc, istate, recycler); } // configure axis limits; just based on count-of-elements UpdateLimits(0); UpdateLimits(AxisLabels.Count); // finish up Layer.Add(recycler.Created); RebuildAxisGeometry(); Dirty = false; }
object IDataSourceRenderer.Preamble(IChartRenderContext icrc) { if (Theme?.TextBlockTemplate == null) { // already reported an error so this should be no surprise return(null); } if (String.IsNullOrEmpty(LabelPath)) { return(null); } var bl = new BindingEvaluator(LabelPath); if (bl == null) { return(null); } var recycler = new Recycler <FrameworkElement, ItemState>(AxisLabels.Where(tl => tl.element != null).Select(tl => tl.element), CreateElement); ResetLimits(); var widx = LabelStyle?.Find(FrameworkElement.WidthProperty); return(new State(new List <ItemState>(), recycler, icrc, widx == null, bl)); }