Hello. I have the following XAML markup:
<UserControl x:Class="UltrasonicSensors.Views.UltrasonicSensorsView" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True"> <UserControl.Resources> <!--Spline series style--> <Style x:Key="SplineSeriesStyle" TargetType="telerik:SplineSeries"> <Setter Property="Stroke" Value="RoyalBlue"/> <Setter Property="StrokeThickness" Value="3"/> </Style> <!--Content template of each RadTileViewItem--> <DataTemplate x:Key="ContentTemplate"> <telerik:RadCartesianChart x:Name="chart1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" EmptyContent="{Binding ChartEmptyContent}"> <!--Turn scrollbar off--> <telerik:RadCartesianChart.Resources> <Style TargetType="telerik:PanZoomBar"> <Setter Property="Visibility" Value="Collapsed"/> </Style> </telerik:RadCartesianChart.Resources> <!-- X-axis --> <telerik:RadCartesianChart.HorizontalAxis> <telerik:CategoricalAxis LabelInterval="6"/> </telerik:RadCartesianChart.HorizontalAxis> <!-- Y-axis --> <telerik:RadCartesianChart.VerticalAxis> <telerik:LinearAxis Minimum="-128" Maximum="127" MajorStep="8" /> </telerik:RadCartesianChart.VerticalAxis> <!--Spline series itself--> <telerik:SplineSeries CategoryBinding="Item1" ValueBinding="Item2" ItemsSource="{Binding SensorData}" Style="{StaticResource SplineSeriesStyle}"/> <!--Layout grid--> <telerik:RadCartesianChart.Grid> <telerik:CartesianChartGrid MajorLinesVisibility="XY" StripLinesVisibility="XY" IsTabStop="False"> <telerik:CartesianChartGrid.YStripeBrushes> <SolidColorBrush Color="#FFD7D7D7" Opacity="0.3" /> <SolidColorBrush Color="Transparent" /> </telerik:CartesianChartGrid.YStripeBrushes> <telerik:CartesianChartGrid.XStripeBrushes> <SolidColorBrush Color="#FFD7D7D7" Opacity="0.3" /> <SolidColorBrush Color="Transparent" /> </telerik:CartesianChartGrid.XStripeBrushes> </telerik:CartesianChartGrid> </telerik:RadCartesianChart.Grid> <!--Panning and zooming--> <telerik:RadCartesianChart.Behaviors> <telerik:ChartPanAndZoomBehavior DragMode="Pan" ZoomMode="Both" PanMode="Both"/> </telerik:RadCartesianChart.Behaviors> </telerik:RadCartesianChart> </DataTemplate> </UserControl.Resources> <Grid> <!--Ultrasonic sensors signals charts:--> <telerik:RadTileView Grid.Row="0" Grid.Column="0" PreservePositionWhenMaximized="True" MinimizedColumnWidth="150" ItemsSource="{Binding SensorSignalCharts}" DisplayMemberPath="ChartCaption" ContentTemplate="{StaticResource ContentTemplate}"> </telerik:RadTileView> </Grid></UserControl>For the RadCartesianChart above I have the following ViewModel:
using Prism.Mvvm;using System;using Telerik.Windows.Data;namespace UltrasonicSensors.ViewModels{ /// <summary> /// Ultrasonic sensor signal ViewModel. /// </summary> public class SensorSignalChartViewModel : BindableBase { #region Fields /// <summary> /// Ultrasonic sensor signal chart point collection. /// </summary> private RadObservableCollection<Tuple<int, double>> _sensorData; /// <summary> /// Data missing Message. /// </summary> private object _chartEmptyContent; /// <summary> /// Chart header. /// </summary> private string _caption; #endregion #region Constructors /// <summary> /// Create instance of SensorSignalViewModel. /// </summary> /// <param name="aSensorData">Ultrasonic sensor signal chart point collection.</param> public SensorSignalChartViewModel(Tuple<int, double>[] aSensorData) { this.SensorData = new RadObservableCollection<Tuple<int, double>>(aSensorData); } #endregion #region Properties /// <summary> /// Gets or sets ultrasonic sensor signal chart point collection. /// </summary> public RadObservableCollection<Tuple<int, double>> SensorData { get { return this._sensorData; } set { this.SetProperty(ref this._sensorData, value); } } /// <summary> /// Gets or sets data missing message. /// </summary> public object ChartEmptyContent { get { return this._chartEmptyContent; } set { this.SetProperty(ref this._chartEmptyContent, value); } } /// <summary> /// Gets or sets chart header. /// </summary> public string ChartCaption { get { return this._caption; } set { this.SetProperty(ref this._caption, value); } } #endregion }}As you can see above, RadCartesianChart in "ContentTemplate" DataTemplate is bound to this ViewModel. And there is another ViewModel called UltrasonicSensorsViewModel which contain RadObservableCollection of SensorSignalChartViewModel. Please see it below:
/// <summary>/// ViewModel of charts of ultrasonic sensors signals./// </summary>public class UltrasonicSensorsViewModel : BindableBase, IConfirmNavigationRequest{ #region Fields #region Constant Fields /// <summary> /// Data missing message. /// </summary> private const string NO_DATA_FOR_CHART = "Нет данных для построения графика"; /// <summary> /// Number of points in each signal chart. /// </summary> private const int CHART_POINTS_QUANTITY = 180; #endregion #region Common Variable Fields /// <summary> /// Ultrasonic sensors quantity. /// </summary> private int _sensorsQuantity; /// <summary> /// Collection of sensorSignalChartViewModel instances. /// </summary> private RadObservableCollection<SensorSignalChartViewModel> _sensorSignalCharts; /// <summary> /// Sensors polling timer. /// </summary> private Timer _sensorsPollingTimer; /// <summary> /// Timer period in millisecond. /// </summary> private long _pollingPeriod = 500; #endregion #endregion #region Constructors public UltrasonicSensorsViewModel() { // This is dummy data to simulate (imitate) each chart. byte[] aDummyData = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0xFE, 0xFE, 0xFF, 0x00, 0x01, 0x03, 0x02, 0x01, 0x00, 0xFD, 0xFC, 0xFD, 0x00, 0x04, 0x06, 0x07, 0x03, 0xFD, 0xF7, 0xF3, 0xF6, 0x00, 0x0B, 0x14, 0x15, 0x0C, 0xFC, 0xEA, 0xDF, 0xE2, 0xF4, 0x0E, 0x26, 0x2F, 0x24, 0x07, 0xE4, 0xCA, 0xC6, 0xDB, 0x01, 0x2B, 0x44, 0x41, 0x22, 0xF3, 0xC8, 0xB4, 0xBF, 0xE6, 0x18, 0x41, 0x4E, 0x3B, 0x10, 0xE0, 0xBE, 0xB8, 0xCF, 0xF9, 0x23, 0x3E, 0x3E, 0x26, 0x01, 0xDF, 0xCD, 0xCF, 0xE5, 0x01, 0x1A, 0x27, 0x23, 0x13, 0x00, 0xEF, 0xE7, 0xE9, 0xF2, 0xFE, 0x08, 0x0D, 0x0E, 0x0B, 0x06, 0x01, 0xFD, 0xF9, 0xF6, 0xF6, 0xF8, 0xFD, 0x03, 0x0A, 0x0E, 0x0D, 0x07, 0xFF, 0xF5, 0xF0, 0xF0, 0xF7, 0x00, 0x0A, 0x10, 0x0E, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; this.SensorSignalCharts = new RadObservableCollection<SensorSignalChartViewModel>(); Tuple<int, double>[] aSensorData = new Tuple<int, double>[CHART_POINTS_QUANTITY]; // Create array of chart data (i==X, aDummyData[i] == Y) for (int i = 0; i < aDummyData.Length; i++) aSensorData[i] = new Tuple<int, double>(i, aDummyData[i]); // Create eight (8) RadTileViewItems. The content of each RadTileViewItem is a chart with simulating data SensorSignalChartViewModel sscm = new SensorSignalChartViewModel(aSensorData); sscm.ChartCaption = "График сигнала от первого сенсора"; sscm.ChartEmptyContent = NO_DATA_FOR_CHART; this.SensorSignalCharts.Add(sscm); sscm = new SensorSignalChartViewModel(aSensorData); sscm.ChartCaption = "График сигнала от второго сенсора"; sscm.ChartEmptyContent = NO_DATA_FOR_CHART; this.SensorSignalCharts.Add(sscm); sscm = new SensorSignalChartViewModel(aSensorData); sscm.ChartCaption = "График сигнала от третьего сенсора"; sscm.ChartEmptyContent = NO_DATA_FOR_CHART; this.SensorSignalCharts.Add(sscm); sscm = new SensorSignalChartViewModel(aSensorData); sscm.ChartCaption = "График сигнала от четвёртого сенсора"; sscm.ChartEmptyContent = NO_DATA_FOR_CHART; this.SensorSignalCharts.Add(sscm); sscm = new SensorSignalChartViewModel(aSensorData); sscm.ChartCaption = "График сигнала от пятого сенсора"; sscm.ChartEmptyContent = NO_DATA_FOR_CHART; this.SensorSignalCharts.Add(sscm); sscm = new SensorSignalChartViewModel(aSensorData); sscm.ChartCaption = "График сигнала от шестого сенсора"; sscm.ChartEmptyContent = NO_DATA_FOR_CHART; this.SensorSignalCharts.Add(sscm); sscm = new SensorSignalChartViewModel(aSensorData); sscm.ChartCaption = "График сигнала от седьмого сенсора"; sscm.ChartEmptyContent = NO_DATA_FOR_CHART; this.SensorSignalCharts.Add(sscm); sscm = new SensorSignalChartViewModel(aSensorData); sscm.ChartCaption = "График сигнала от восмого сенсора"; sscm.ChartEmptyContent = NO_DATA_FOR_CHART; this.SensorSignalCharts.Add(sscm); // Create timer but don't start yet. this._sensorsPollingTimer = new Timer(this.sensorsPollingTimerCallback, null, -1, this._pollingPeriod); } #endregion #region Properties /// <summary> /// Gets or sets collection of SensorSignalChartViewModel instances. /// </summary> public RadObservableCollection<SensorSignalChartViewModel> SensorSignalCharts { get { return this._sensorSignalCharts; } set { this.SetProperty(ref this._sensorSignalCharts, value); } } #endregion #region Methods /// <summary> /// Timer tick handler. /// </summary> /// <param name="state"></param> private void sensorsPollingTimerCallback(object state) { } #endregion #region IConfirmNavigationRequest Implementation void IConfirmNavigationRequest.ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback) { continuationCallback(true); } bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext) { return true; } void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext) { ; } void INavigationAware.OnNavigatedTo(NavigationContext navigationContext) { ; } #endregion}When I run my program I see no charts as you can see in EmptyCharts.PNG file attached. Why I see no charts? Please help me.
