I have used RadChart for displaying graph, On legend i have used chekboxes for each item. upon which the respective series will be show/hide.On opening the form the data is loaded and legend items are checked by default. The problem is that when i unchecked the items and then scroll the chart or zoom in the checboxes are automatically checked, although the series are hidden as i have already uncheck the items.Why the checkboxes are automatically got checked on zooming or scrolling.I want the checkboxes to remain unchecked
User control class
here is the XAML code
View model class
WPF application class
User control class
public partial class UserControl1 : UserControl { DataSeries lineSeries; SeriesMapping seriesMapping; SeriesDefinition seriesDefinition; vm objvm; List<Data> vitalSign; List<CheckBox> VSChk; public Dictionary<object, bool?> chkbxState; public UserControl1() { InitializeComponent(); radChart1.DefaultView.ChartArea.AxisX.LayoutMode = AxisLayoutMode.Between; radChart1.DefaultView.ChartArea.AxisX.AxisLabelsVisibility = Visibility.Hidden; //radChart1.DefaultView.ChartArea.AxisX.LabelRotationAngle = 45; radChart1.DefaultView.ChartArea.ZoomScrollSettingsX.ScrollMode = ScrollMode.ScrollAndZoom; radChart1.DefaultView.ChartArea.ZoomScrollSettingsX.MinZoomRange = 0.2; radChart1.DefaultView.ChartLegend.UseAutoGeneratedItems = true; } public void initViewModel() { objvm = ((vm)this.FindResource("ViewModel")); vitalSign = new List<Data>(); } public void addData(string XValue, string YValue, string VSCode, string EncounterDate) { vitalSign.Add(new Data(DateTime.Parse(XValue), double.Parse(YValue), VSCode, DateTime.Parse(EncounterDate))); } public void setSeriesMapping() { // List<Data> vs; try { var v1 = (from c1 in vitalSign select new { itemCode = c1.vsCode }).Distinct().ToList(); foreach (var item in v1) { // vs = new List<Data>(); seriesMapping = new SeriesMapping(); seriesDefinition = new LineSeriesDefinition(); seriesDefinition.ShowItemToolTips = true; seriesMapping.LegendLabel = item.itemCode; seriesMapping.SeriesDefinition = seriesDefinition; seriesMapping.SeriesDefinition.Visibility = SeriesVisibility.Visible; var v2 = from c2 in vitalSign where c2.vsCode == item.itemCode select c2; seriesMapping.ItemMappings.Add(new ItemMapping("encounterDate", DataPointMember.XCategory)); seriesMapping.ItemMappings.Add(new ItemMapping("Y", DataPointMember.YValue)); seriesMapping.ItemMappings.Add(new ItemMapping("toolTip", DataPointMember.Tooltip)); /*foreach (var vitalsign in v2) { vs.Add(new Data(vitalsign.X, vitalsign.Y, vitalsign.vsCode, vitalsign.encounterDate)); } */ objvm._mapping.Add(seriesMapping.LegendLabel, seriesMapping); // seriesMapping.ItemsSource = vs; seriesMapping.ItemsSource = v2.ToList(); radChart1.SeriesMappings.Add(seriesMapping); } } catch (Exception ex) { } } public void setData(string controlname) { // not use now try { seriesMapping = new SeriesMapping(); seriesDefinition = new LineSeriesDefinition(); seriesDefinition.ShowItemToolTips = true; seriesMapping.LegendLabel = controlname; seriesMapping.SeriesDefinition = seriesDefinition; seriesMapping.SeriesDefinition.Visibility = SeriesVisibility.Visible; // seriesMapping.ItemMappings.Add(new ItemMapping("X", DataPointMember.XValue)); seriesMapping.ItemMappings.Add(new ItemMapping("X", DataPointMember.XCategory)); seriesMapping.ItemMappings.Add(new ItemMapping("Y", DataPointMember.YValue)); seriesMapping.ItemMappings.Add(new ItemMapping("toolTip", DataPointMember.Tooltip)); seriesMapping.ItemsSource = this.vitalSign; objvm._mapping.Add(seriesMapping.LegendLabel, seriesMapping); radChart1.SeriesMappings.Add(seriesMapping); } catch (Exception ex) { } } public void setDataLineSeries() { try { var v7 = (from c7 in vitalSign select new { itemCode = c7.vsCode }).Distinct().ToList(); foreach (var item in v7) { lineSeries = new DataSeries(); lineSeries.Definition = new LineSeriesDefinition(); lineSeries.Definition.ShowItemToolTips = true; lineSeries.LegendLabel = item.itemCode; var v8 = from c8 in vitalSign where c8.vsCode == item.itemCode select c8; foreach (var vitalsign in v8) { lineSeries.Add(new DataPoint() { XCategory = vitalsign.encounterDate.ToString("g"), YValue = vitalsign.Y, Tooltip = vitalsign.toolTip }); } // objvm._series.Add(lineSeries.LegendLabel, lineSeries); radChart1.DefaultView.ChartArea.DataSeries.Add(lineSeries); } } catch (Exception ex) { } } private void RadChart1_Loaded(object sender, RoutedEventArgs e) { /* List<CheckBox> checkBoxes = radChart1.DefaultView.ChartLegend.ChildrenOfType<CheckBox>().ToList<CheckBox>(); if (checkBoxes.Count > 0) { checkBoxes[0].IsEnabled = false; } // SetSeriesItemStyle(); */ } public void getchkbxControl() { VSChk = new List<CheckBox>(); var mapping = radChart1.SeriesMappings; try { for (int i = 0; i < mapping.Count; i++) { ChartLegendItem legendItem = (radChart1.DefaultView.ChartLegend as System.Windows.Controls.ItemsControl).Items[i] as ChartLegendItem; CheckBox checkBox = legendItem.ChildrenOfType<CheckBox>().FirstOrDefault(); VSChk.Add(checkBox); } } catch (Exception ex) { } } private void AxisX_RangeChanged(object sender, EventArgs e) { try { if (VSChk != null) { foreach (var item in VSChk) { item.IsChecked = chkbxState[item.Content].Value; } } } catch (Exception ex) { } } private void CheckBox_Checked(object sender, RoutedEventArgs e) { chkbxState = new Dictionary<object, bool?>(); foreach (var item in VSChk) { chkbxState.Add(item.Content, item.IsChecked); } } private void ChartArea_Loaded(object sender, RoutedEventArgs e) { } private void post_Unchecked(object sender, RoutedEventArgs e) { chkbxState = new Dictionary<object, bool?>(); foreach (var item in VSChk) { chkbxState.Add(item.Content, item.IsChecked); } } }here is the XAML code
<UserControl x:Class="HMVitalSignGraph.UserControl1" xmlns:example="clr-namespace:HMVitalSignGraph" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="500"> <UserControl.Resources> <example:vm x:Key="ViewModel" /> <Style x:Key="SeriesItemLabelStyle" TargetType="telerik:SeriesItemLabel"> <Setter Property="HorizontalContentAlignment" Value="Center" /> <Setter Property="Padding" Value="2,0" /> <Setter Property="Foreground" Value="Black" /> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="FontFamily" Value="Trebuchet MS" /> <Setter Property="FontSize" Value="12" /> </Style> <Style x:Key="CustomLegendItemStyle" TargetType="telerik:ChartLegendItem"> <Setter Property="Template" > <Setter.Value> <ControlTemplate TargetType="telerik:ChartLegendItem"> <Grid x:Name="PART_MainContainer" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="0,0,5,0"> <Path x:Name="PART_LegendItemMarker" Height="20" Width="150" Style="{TemplateBinding ItemStyle}" Stretch="UniformToFill"> <Path.Data> <PathGeometry x:Name="PART_ItemMarkerGeometry" /> </Path.Data> </Path> <CheckBox x:Name="post" IsChecked="True" Foreground="Black" VerticalAlignment="Center" Margin="2,0" Content="{TemplateBinding Label}" Background="{TemplateBinding Background}" Command="{Binding Path=ChangeSeriesVisibilityCommand, Source={StaticResource ViewModel}}" CommandParameter="{TemplateBinding Label}" Checked="CheckBox_Checked" Unchecked="post_Unchecked" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </UserControl.Resources> <Canvas x:Name="canv" Background="#edf7ff"> <Grid Width="{Binding ActualWidth, ElementName=canv}" Height="{Binding ActualHeight, ElementName=canv}" MinWidth="1"> <telerik:RadChart Name="radChart1" DataContext="{Binding}" HorizontalAlignment="Left" telerik:StyleManager.Theme="Windows7" Loaded="RadChart1_Loaded" VerticalAlignment="Top" > <telerik:RadChart.DefaultView> <telerik:ChartDefaultView ChartLegendPosition="Right"> <!--<telerik:ChartDefaultView.ChartTitle> <telerik:ChartTitle>CDC growth chart</telerik:ChartTitle> </telerik:ChartDefaultView.ChartTitle>--> <telerik:ChartDefaultView.ChartLegend> <telerik:ChartLegend x:Name="PrimaryLegend" Header="Click on vital signs to hide/show:" LegendItemMarkerShape="Square" LegendItemStyle="{StaticResource CustomLegendItemStyle}" /> </telerik:ChartDefaultView.ChartLegend> <telerik:ChartDefaultView.ChartArea > <telerik:ChartArea SmartLabelsEnabled="True" EnableAnimations="False" Padding="5,10,20,5" LabelFormatBehavior="HumanReadable" LegendName="PrimaryLegend" FontSize="10" Loaded="ChartArea_Loaded" > <telerik:ChartArea.AxisX> <telerik:AxisX RangeChanged="AxisX_RangeChanged" /> </telerik:ChartArea.AxisX> <!--<telerik:ChartArea.AxisY> <telerik:AxisY ExtendDirection="None" /> </telerik:ChartArea.AxisY>--> </telerik:ChartArea> </telerik:ChartDefaultView.ChartArea> </telerik:ChartDefaultView> </telerik:RadChart.DefaultView> </telerik:RadChart> </Grid> </Canvas> </UserControl>View model class
class vm : ViewModelBase { public Dictionary<string, SeriesMapping> _mapping = new Dictionary<string, SeriesMapping>(); //public Dictionary<string, DataSeries> _series = new Dictionary<string, DataSeries>(); private ICommand _changeSeriesVisibilityCommand; public SeriesMapping this[string name] { get { return _mapping[name]; } set { _mapping[name] = value; } } /* public DataSeries this[string name] { get { return _series[name]; } set { _series[name] = value; } } */ public vm() { this.WireCommands(); } public void WireCommands() { this.ChangeSeriesVisibilityCommand = new DelegateCommand(this.ChangeSeriesVisibility); } public ICommand ChangeSeriesVisibilityCommand { get { return this._changeSeriesVisibilityCommand; } private set { this._changeSeriesVisibilityCommand = value; } } public void ChangeSeriesVisibility(object parameter) { try { string parm = parameter.ToString(); if (this._mapping[parm].SeriesDefinition.Visibility == SeriesVisibility.Collapsed || this._mapping[parm].SeriesDefinition.Visibility == SeriesVisibility.Hidden) this._mapping[parm].SeriesDefinition.Visibility = SeriesVisibility.Visible; else this._mapping[parm].SeriesDefinition.Visibility = SeriesVisibility.Hidden; /* if (this._series[parm].Definition.Visibility == SeriesVisibility.Collapsed || this._series[parm].Definition.Visibility == SeriesVisibility.Hidden) this._series[parm].Definition.Visibility = SeriesVisibility.Visible; else this._series[parm].Definition.Visibility = SeriesVisibility.Hidden; */ } catch (Exception ex) { throw; } } }WPF application class
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); userControl11.initViewModel(); userControl11.addData(DateTime.Now.ToString("g"), "10", "Diasystolic blood pressure", DateTime.Now.ToString("g")); userControl11.addData(DateTime.Now.AddDays(2).ToString("g"), "20", "Diasystolic blood pressure", DateTime.Now.ToString("g")); userControl11.addData(DateTime.Now.AddDays(4).ToString("g"), "30", "Diasystolic blood pressure", DateTime.Now.AddDays(2).ToString("g")); userControl11.addData(DateTime.Now.AddDays(6).ToString(), "40", "Diasystolic blood pressure", DateTime.Now.AddDays(2).ToString("g")); userControl11.addData(DateTime.Now.AddDays(8).ToString(), "50", "Diasystolic blood pressure", DateTime.Now.AddDays(2).ToString("g")); userControl11.addData(DateTime.Now.AddDays(10).ToString(), "60", "Diasystolic blood pressure", DateTime.Now.AddDays(4).ToString("g")); userControl11.addData(DateTime.Now.AddDays(11).ToString(), "70", "Diasystolic blood pressure", DateTime.Now.AddDays(4).ToString("g")); userControl11.addData(DateTime.Now.AddDays(12).ToString(), "80", "Diasystolic blood pressure", DateTime.Now.AddDays(6).ToString("g")); userControl11.addData(DateTime.Now.AddDays(1).ToString(), "10", "Pulse rate", DateTime.Now.AddDays(1).ToString("g")); userControl11.addData(DateTime.Now.AddDays(3).ToString(), "60", "Pulse rate", DateTime.Now.AddDays(1).ToString("g")); userControl11.addData(DateTime.Now.AddDays(5).ToString(), "90", "Pulse rate", DateTime.Now.AddDays(3).ToString("g")); userControl11.addData(DateTime.Now.AddDays(7).ToString(), "20", "Pulse rate", DateTime.Now.AddDays(3).ToString("g")); userControl11.addData(DateTime.Now.AddDays(9).ToString(), "110", "Pulse rate", DateTime.Now.AddDays(5).ToString("g")); userControl11.addData(DateTime.Now.AddDays(1).ToString(), "5", "rate", DateTime.Now.ToString("g")); userControl11.addData(DateTime.Now.AddDays(3).ToString(), "15", "rate", DateTime.Now.AddDays(1).ToString("g")); userControl11.addData(DateTime.Now.AddDays(5).ToString(), "25", "rate", DateTime.Now.AddDays(5).ToString("g")); userControl11.addData(DateTime.Now.AddDays(7).ToString(), "35", "rate", DateTime.Now.AddDays(5).ToString("g")); userControl11.addData(DateTime.Now.AddDays(9).ToString(), "45", "rate", DateTime.Now.AddDays(7).ToString("g")); userControl11.setSeriesMapping(); } private void Window_Loaded(object sender, RoutedEventArgs e) { userControl11.getchkbxControl(); }