I have created a XamDataChart that is bound to a real-time data source. I need the x-axis (Date) to update in real-time. Currently the x-axis labels are only updated when the chart is re-sized horizontally. Is there any way to have the x-axis labels update in real-time?
Kevin, does the collection that the XAxis is bound to support INotifyCollectionChanged? Can you post any kind of sample of how you have this configured?
The collection is bound to an ObservableCollection.
Here is my CategoryXAxis. The X-Axis labels are only updated when the chart is resized.
<igChart:CategoryXAxis x:Name="XAxis" VerticalAlignment="Bottom" Style="{StaticResource CategoryXAxisStyle}" ItemsSource="{Binding Data}" Label="{}{TimeStamp:mm:ss}"> <igChart:CategoryXAxis.LabelSettings> <igChart:AxisLabelSettings Location="OutsideBottom" Extent="25"/> </igChart:CategoryXAxis.LabelSettings> </igChart:CategoryXAxis>
Thanks Kevin, I'll take a look.
Graham, Any progress? I only have one day left on my evaluation and I was hoping to have a solution.
Kevin,How does what you are doing differ from the below. This appears to work for me. Or am I not correctly modelling what you are trying to accomplish?
<ig:XamDataChart Name="xamDataChart1" > <ig:XamDataChart.Axes> <ig:CategoryXAxis x:Name="XAxis" VerticalAlignment="Bottom" ItemsSource="{Binding}" Label="{}{TimeStamp:mm:ss}"> <ig:CategoryXAxis.LabelSettings> <ig:AxisLabelSettings Location="OutsideBottom" Extent="25"/> </ig:CategoryXAxis.LabelSettings> </ig:CategoryXAxis> <ig:NumericYAxis x:Name="YAxis" /> </ig:XamDataChart.Axes> <ig:XamDataChart.Series> <ig:LineSeries XAxis="{Binding ElementName=XAxis}" YAxis="{Binding ElementName=YAxis}" ItemsSource="{Binding}" ValueMemberPath="Value" /> </ig:XamDataChart.Series> </ig:XamDataChart>
The code behind:
public partial class MainPage : UserControl { private Random _rand = new Random(); private DispatcherTimer _timer = new DispatcherTimer(); private double _curr = 0.0; private TestData _td = new TestData(); public MainPage() { InitializeComponent(); DataContext = _td; _timer.Interval = new TimeSpan(0,0,0,0,250); _timer.Tick += Timer_Tick; _timer.Start(); } void Timer_Tick(object sender, EventArgs e) { if (_rand.NextDouble() > .5) { _curr += _rand.NextDouble(); } else { _curr -= _rand.NextDouble(); } _td.Add( new TestDataItem() { TimeStamp = DateTime.Now, Value = _curr }); if (_td.Count > 15) { _td.RemoveAt(0); } } } public class TestData : ObservableCollection<TestDataItem> { } public class TestDataItem { public DateTime TimeStamp { get; set; } public double Value { get; set; } }
-Graham
Graham, your example works where the collection is bound to an observable collection. In my case I am trying to prevent the real-time chart from being updated any time a new point is added (30 Hz). In this case I am using a collection that implements INotifyCollectionChanged. I am performing a bulk insert/delete from my real-time collection and then signaling NotifyCollectionChangedAction.Reset. This causes the problem I am seeing with the X-Axis refresh.
How can I send you my sample code?
Was the fix for this bug ever released? If so, which version is it in?
Hi Graham,
Thanks for quick reply. Yes it was the issue I was not notifying property change. Thanks once again.
Hi,
Does your collection implement INotifyCollectionChanged? Could you share a small sample illustrating the incorrect behavior? That would help us identify the problem.
I am also having the same issue of not updating the horizontal labels. I am using categoryXAxis for labels which is binded with a collection which is dynamic and its values are also volatile. In code collection is getting updates but its not visible on the chart surface. Can you please suggest something in this regard.
Thanks.
You can reference a bug number when you contact developer support to check the status of a bug. Could you describe the problem you are having so we can be sure its already captured?
Thanks,