I'm using the RadCartesianChart to display a dynamic number of series in a lineseries and am trying to get it to refresh automatically when the collection that drives the ChartSeriesProvider is changed. I am using the MVVM pattern.
This is the XAML defining my charts.
<
chart:RadCartesianChart
Grid.Column
=
"0"
Grid.Row
=
"0"
x:Name
=
"ColumnChart"
>
<
chart:RadCartesianChart.HorizontalAxis
>
<
chartView:CategoricalAxis
Title
=
"Date"
/>
</
chart:RadCartesianChart.HorizontalAxis
>
<
chart:RadCartesianChart.VerticalAxis
>
<
chartView:LinearAxis
Title
=
"Value"
/>
</
chart:RadCartesianChart.VerticalAxis
>
<
chart:RadCartesianChart.Behaviors
>
<
chartView:ChartTooltipBehavior
Placement
=
"Top"
VerticalOffset
=
"20"
/>
<
chartView:ChartPanAndZoomBehavior
ZoomMode
=
"Both"
/>
</
chart:RadCartesianChart.Behaviors
>
<
chart:RadCartesianChart.SeriesProvider
>
<
chartView:ChartSeriesProvider
IsDynamicSeries
=
"True"
Source
=
"{Binding FilteredSeries}"
>
<
chartView:ChartSeriesProvider.SeriesDescriptors
>
<
chartView:CategoricalSeriesDescriptor
ItemsSourcePath
=
"Values"
CategoryPath
=
"Date"
ValuePath
=
"Value"
>
<
chartView:CategoricalSeriesDescriptor.Style
>
<
Style
TargetType
=
"chartView:LineSeries"
>
<
Setter
Property
=
"StrokeThickness"
Value
=
"2"
/>
<
Setter
Property
=
"PointTemplate"
Value
=
"{StaticResource PointTemplate}"
/>
</
Style
>
</
chartView:CategoricalSeriesDescriptor.Style
>
</
chartView:CategoricalSeriesDescriptor
>
</
chartView:ChartSeriesProvider.SeriesDescriptors
>
</
chartView:ChartSeriesProvider
>
</
chart:RadCartesianChart.SeriesProvider
>
</
chart:RadCartesianChart
>
This is the View model driving the chart.
public
class
PostProcessingColumnChartViewModel : INotifyPropertyChanged
{
private
ObservableCollection<ChartSeries> _series;
private
ObservableCollection<
long
> _availableLineNumbers;
private
long
_selectedLineNumber = -1;
public
PostProcessingColumnChartViewModel(PostProcessingEntry entry)
{
Name = entry.Name;
AvailableLineNumbers.Add(-1);
foreach
(var postProcessingRecord
in
entry.Records)
{
if
(!postProcessingRecord.Value.LineNumber.HasValue)
continue
;
var series =
new
ChartSeries()
{
SerialNumber = postProcessingRecord.Value.SerialNumber,
LineNumber = postProcessingRecord.Value.LineNumber,
PointNumber = postProcessingRecord.Value.StationNumber
};
foreach
(var value
in
postProcessingRecord.Value.Values)
{
series.Values.Add(
new
ChartRecord() {Date = value.Key, Value = value.Value});
}
Series.Add(series);
}
var lineNumbers = Series.Where(s => s.LineNumber.HasValue).Select(s => s.LineNumber.Value).Distinct().OrderBy(ln => ln).ToList();
foreach
(var lineNumber
in
lineNumbers)
{
AvailableLineNumbers.Add(lineNumber);
}
}
public
string
Name {
get
;
set
; }
public
ObservableCollection<ChartSeries> Series => _series ?? (_series =
new
ObservableCollection<ChartSeries>());
public
ObservableCollection<
long
> AvailableLineNumbers => _availableLineNumbers ?? (_availableLineNumbers =
new
ObservableCollection<
long
>());
public
ObservableCollection<ChartSeries> FilteredSeries =>
new
ObservableCollection<ChartSeries>(Series);
public
long
SelectedLineNumber
{
get
{
return
_selectedLineNumber; }
set
{
if
(_selectedLineNumber == value)
return
;
_selectedLineNumber = value;
OnPropertyChanged();
}
}
public
event
PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected
virtual
void
OnPropertyChanged([CallerMemberName]
string
propertyName =
null
)
{
if
(propertyName !=
null
&& propertyName.Equals(
"SelectedLineNumber"
))
{
FilteredSeries.Clear();
if
(SelectedLineNumber > -1)
foreach
(var series
in
Series.Where(s => s.LineNumber == SelectedLineNumber))
{
FilteredSeries.Add(series);
}
else
foreach
(var series
in
Series)
{
FilteredSeries.Add(series);
}
}
PropertyChanged?.Invoke(
this
,
new
PropertyChangedEventArgs(propertyName));
}
}
I have these charts in a tab control and if I try and filter one it doesn't change until I view a different graph and then come back to the one I filtered. I know this is because chart goes through the rebinding process and updates but I would like that to happen while the user is currently viewing that chart. Everything seems to beworking except for the chart not updating until a rebinding occurs.