Worked Example - Manipulate Series in MVVM
Worked Example: Manipulate Series in MVVM
Series can be added, removed, or the series type changed in MVVM by simply manipulating the collection bound via SeriesBinding.
e.g. Add a LineRenderableSeriesViewModel with an optional style or properties + DataSeries. To change this to a mountain series, simply replace the viewmodel for a MountainRenderableSeriesViewModel.
View (XAML)
Manipulate Series in MVVM |
Copy Code
|
---|---|
<UserControl x:Class="WpfApplication3.HelloSciChartWorld" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:s="http://schemas.abtsoftware.co.uk/scichart" xmlns:local="clr-namespace:WpfApplication3" mc:Ignorable="d" d:DesignHeight="400" d:DesignWidth="600" Background="#171717"> <UserControl.Resources> <local:HelloSciChartWorldViewModel x:Key="viewModel"/> <Style TargetType="s:FastLineRenderableSeries" x:Key="LineSeriesStyle0"> <Setter Property="StrokeDashArray" Value="5 5"/> <Setter Property="StrokeThickness" Value="2"/> <Setter Property="Stroke" Value="Orange"/> </Style> <Style TargetType="s:FastMountainRenderableSeries" x:Key="MountainSeriesStyle0"> <Setter Property="StrokeThickness" Value="2"/> <Setter Property="Stroke" Value="Orange"/> <Setter Property="Fill"> <Setter.Value> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Offset="0" Color="#AAFF8D42" /> <GradientStop Offset="1" Color="#88090E11" /> </LinearGradientBrush> </Setter.Value> </Setter> </Style> </UserControl.Resources> <Grid DataContext="{StaticResource viewModel}"> <Grid.RowDefinitions> <RowDefinition Height="32"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal"> <CheckBox Content="Line Series?" IsChecked="{Binding IsLineSeries, Mode=TwoWay}" Foreground="White" Margin="5"/> <CheckBox Content="Mountain Series?" IsChecked="{Binding IsMountainSeries, Mode=TwoWay}" Foreground="White" Margin="5"/> </StackPanel> <s:SciChartSurface RenderableSeries="{s:SeriesBinding SeriesViewModels}" Grid.Row="1"> <s:SciChartSurface.XAxis> <s:NumericAxis/> </s:SciChartSurface.XAxis> <s:SciChartSurface.YAxis> <s:NumericAxis GrowBy="0.1, 0.1"/> </s:SciChartSurface.YAxis> </s:SciChartSurface> </Grid> </UserControl> |
ViewModel
Manipulate Series in MVVM |
Copy Code
|
---|---|
public class HelloSciChartWorldViewModel : INotifyPropertyChanged { private readonly ObservableCollection<IRenderableSeriesViewModel> _seriesViewModels = new ObservableCollection<IRenderableSeriesViewModel>(); private bool _isLineSeries; private bool _isMountainSeries; private readonly XyDataSeries<double, double> _xyData; public event PropertyChangedEventHandler PropertyChanged; public HelloSciChartWorldViewModel() { _xyData = new XyDataSeries<double, double>(); for (int i = 0; i < 100; i++) { _xyData.Append(i, Math.Sin(i * 0.2)); } IsLineSeries = true; } public ObservableCollection<IRenderableSeriesViewModel> SeriesViewModels { get { return _seriesViewModels; } } public bool IsLineSeries { get { return _isLineSeries; } set { if (_isLineSeries == value) return; _isLineSeries = value; OnPropertyChanged("IsLineSeries"); if (value) { IsMountainSeries = false; SyncViewModels(); } } } public bool IsMountainSeries { get { return _isMountainSeries; } set { if (_isMountainSeries == value) return; _isMountainSeries = value; OnPropertyChanged("IsMountainSeries"); if (value) { IsLineSeries = false; SyncViewModels(); } } } private void SyncViewModels() { if (IsLineSeries) { SeriesViewModels.Clear(); SeriesViewModels.Add(new LineRenderableSeriesViewModel() { DataSeries = _xyData, StyleKey = "LineSeriesStyle0"}); } else { SeriesViewModels.Clear(); SeriesViewModels.Add(new MountainRenderableSeriesViewModel() { DataSeries = _xyData, StyleKey = "MountainSeriesStyle0" }); } } protected virtual void OnPropertyChanged(string propertyName) { var handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } } |