Created a razor component by customizing a SfChart. Defined a DataSource for the ChartSeries. When I modify an object in the List and then call StateHasChanged(), the chart does not update. If I clear the list, then rebuild the list and call StateHasChanged(), then the chart updates as expected.
public List<ChartData> StaticData = new List<ChartData>
{
new ChartData {X = "1", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "2", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "3", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "4", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "5", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "6", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "7", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "8", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "9", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "10", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "11", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "12", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "13", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "14", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0},
new ChartData {X = "15", Nominal = 45, LCL = 44.7, UCL = 45.3, Y = 45.0}
};
The chart series sets the DataSource to StaticData as defined above.
<SfChart @ref="Chart" Title="Shaft Diameter" Width="2000px" Height="1000px">
<ChartEvents OnLegendClick="LegendClickEvent" ChartMouseClick="ChartMouseClickEvent"></ChartEvents>
<ChartPrimaryXAxis Name="SPC Data" ValueType="Syncfusion.Blazor.Charts.ValueType.Category" Minimum="0" Maximum="14" Title="Sample">
</ChartPrimaryXAxis>
<ChartPrimaryYAxis OpposedPosition=true Title="@yAxisCfg.title" LabelFormat="n3" Minimum="@yAxisCfg.minimum" Maximum="@yAxisCfg.maximum" Interval="@yAxisCfg.interval">
<ChartAxisLineStyle Width="0" ></ChartAxisLineStyle>
<ChartAxisMajorTickLines Width="0" ></ChartAxisMajorTickLines>
</ChartPrimaryYAxis>
<ChartTooltipSettings Enable="true"></ChartTooltipSettings>
<ChartSeriesCollection>
<ChartSeries Name="SPC Data" DataSource="@StaticData" XName="X" YName="Y" Type="ChartSeriesType.Line" Width="3" >
<ChartMarker Visible="true" Width="7" Height="7" Shape="ChartShape.Circle">
<ChartDataLabel Visible="false"/>
</ChartMarker>
</ChartSeries>
<ChartSeries Name="UCL" DataSource="@StaticData" XName="X" YName="UCL" Type="ChartSeriesType.Line "Width="3" DashArray="10,10">
<ChartMarker Visible="false" Width="7" Height="7" Shape="ChartShape.Pentagon">
</ChartMarker>
</ChartSeries>
<ChartSeries Name="Nominal" DataSource="@StaticData" XName="X" YName="Nominal" Type="ChartSeriesType.Line" Width="3" DashArray="5,5">
<ChartMarker Visible="false" Width="7" Height="7" Shape="ChartShape.Diamond">
</ChartMarker>
</ChartSeries>
<ChartSeries Name="LCL" DataSource="@StaticData" XName="X" YName="LCL" Type="ChartSeriesType.Line" Width="3" DashArray="10, 10">
<ChartMarker Visible="false" Width="7" Height="7" Shape="ChartShape.Pentagon">
</ChartMarker>
</ChartSeries>
</ChartSeriesCollection>
<ChartLegendSettings Visible="true" Position=LegendPosition.Custom ></ChartLegendSettings>
</SfChart>
Calling ModifyList() changes the value of StaticData, but StateHasChanged() does not update the chart.
public void ModifyList()
{
StaticData[5].Y = nomValue + (5 * sigma);
StateHasChanged();
}
Hi Wayne,
Greetings from Syncfusion.
We suggest you to use ObservableCollection as datasource and INotifyPropertyChanged interface to update the data in a datasource. We have prepared sample based on your requirement.
public class LineChartData : INotifyPropertyChanged { double eng_InflationRate { get; set; } public double ENG_InflationRate { get { return eng_InflationRate; } set { this.eng_InflationRate = value; NotifyPropertyChanged("ENG_InflationRate"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } public void ChangeData() { this.ChartData[3].ENG_InflationRate = 70; } |
Before Update
After Update
Sample : https://www.syncfusion.com/downloads/support/directtrac/general/ze/UpdateData1013559496.zip
UG : https://blazor.syncfusion.com/documentation/common/data-binding/data-updates#inotifypropertychanged
Please revert us if you have any concerns.
Regards,
Durga Gopalakrishnan.
Thanks. I modified my code to use ObservableCollection. That works as you described.
Hi Wayne,
Most welcome. Please get back to us if you need any further assistance. We are always happy in assisting you.
Regards,
Durga Gopalakrishnan