/// <summary> /// Removes data point's legend item when the data point is removed. /// </summary> /// <param name="dataPoint">The data point to remove.</param> protected override void RemoveDataPoint(DataPoint dataPoint) { base.RemoveDataPoint(dataPoint); if (dataPoint != null) { LegendItem legendItem = _dataPointLegendItems[dataPoint]; _dataPointLegendItems.Remove(dataPoint); LegendItems.Remove(legendItem); UpdateLegendItemIndexes(); } }
/// <summary> /// Manage dynamic legend updates. /// </summary> /// <param name="sender">Component sending update.</param> /// <param name="ldea">Current state of legend.</param> private void Ipld_LegendChanged(ChartComponent sender, LegendDynamicEventArgs ldea) { foreach (var prev in ldea.PreviousItems) { if (!ldea.CurrentItems.Contains(prev)) { LegendItems.Remove(prev); } } foreach (var curr in ldea.CurrentItems) { if (!LegendItems.Contains(curr)) { LegendItems.Add(curr); } } }
/// <summary> /// Common logic for leaving the chart. /// SHOULD be strict dual of ComponentEnter sequence. /// </summary> /// <param name="icelc">The context.</param> /// <param name="cc">The component leaving chart.</param> protected void ComponentLeave(IChartEnterLeaveContext icelc, ChartComponent cc) { foreach (var px in AllPhases) { px.Leave(cc); } if (cc is IProvideDataSourceRenderer ipdsr) { Unregister(ipdsr.Renderer); } else if (cc is IDataSourceRenderer idsr) { Unregister(idsr); } if (cc is IChartAxis ica) { Axes.Remove(ica); } if (cc is IProvideLegendDynamic ipld) { // detach the event ipld.LegendChanged -= Ipld_LegendChanged; } if (cc is IProvideLegend ipl) { foreach (var li in ipl.LegendItems) { LegendItems.Remove(li); } } if (cc is IRequireEnterLeave irel) { irel.Leave(icelc); } if (cc is IRequireChartTheme irct) { irct.Theme = null; } }