C1Chart for WPF can be used with the MVVM design pattern. The concept applied is the same as you would use for other data-aware controls. The ViewModel should expose the collection and binding properties and all these can easily be set in XAML of the Chart view. In this article I will walk you through the basic steps to bind the chart in MVVM pattern. Let’s start by creating a new WPF application. Add the following Sales class to the project.


public  class Sales  
    {  
      public Sales(string product,double salevalue)  
      {  
          _product = product;  
          _salevalue = salevalue;  
      }  
        #region privateFields  
      string _product;  
      double _salevalue;  
        #endregion  
        #region publicProperties  
      public string Product  
      {  
          get { return _product; }  
          set { _product = value; }  
      }  
      public double SaleValue  
      {  
          get { return _salevalue; }  
          set { _salevalue = value; }  
      }  
        #endregion  
    }  

Next we will create ViewModelBase class which our SalesViewModel will inherit from. The base view model implements the INotifyPropertyChanged interface.


public class ViewModelBase:INotifyPropertyChanged  
{  
#region INotifyPropertyChanged Members  

public event PropertyChangedEventHandler PropertyChanged;  

#endregion  
public ViewModelBase()  
{  
}  
protected void OnPropertyChanged(string property)  
{  
if (PropertyChanged != null)  
{  
PropertyChanged(this, new PropertyChangedEventArgs(property));  
}  
}  
}  

Now let’s create the ChartViewModel.


public class ChartViewModel:ViewModelBase  
{  
#region Ctor..  
public ChartViewModel()  
{  
_saleslist = new ObservableCollection<Sales>();  
LoadData();  

}  
#endregion  
#region private Fields  
ObservableCollection<Sales> _saleslist;  
#endregion  
#region publicProperties  
public ObservableCollection<Sales> SalesList  
{  
get { return _saleslist; }  
set { _saleslist = value; OnPropertyChanged("SalesList");}  
}  
#endregion  
#region privateMethods  
void LoadData()  
{  
_saleslist.Add(new Sales("Confectionaries", 2500));  
_saleslist.Add(new Sales("Plastics", 3500));  
_saleslist.Add(new Sales("Electronics", 7500));  
_saleslist.Add(new Sales("Produces", 800));  
}  
#endregion  
}  

In this class we simply create a SalesList collection and load data to it. Next drop a C1Chart on the MainWindow. Add the name space for the ViewModel as below. xmlns:local="clr-namespace:C1ChartMVVMSample.ViewModel" Create a Resource as below for the ChartViewModel.


<Window.Resources>  
    <local:ChartViewModel x:Key="vm"/>  
</Window.Resources>  

Set the datacontext of the control which has the Chart such as:


DataContext="{StaticResource vm}"  

Set the datacontext of the chart such as:


DataContext="{Binding Path=SalesList}"  

Set ChartData ItemNameBinding to the product field of the Sales class such as below:


ItemNameBinding="{Binding Path=Product}"  

Set chart's DataSeries ValueBinding to the SaleValue field of the Sales class:


ValueBinding="{Binding Path=SaleValue}"  

That’s all we need to do. The complete XAML for MainWindow is below:


<Window x:Class="C1ChartMVVMSample.MainWindow"  
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
     Title="MainWindow" Height="350" Width="525"  
     xmlns:loacl="clr-namespace:C1ChartMVVMSample.ViewModel"  
     xmlns:c1chart="http://schemas.componentone.com/xaml/c1chart">  
     <Window.Resources>  
          <loacl:ChartViewModel x:Key="vm"/>  
     </Window.Resources>  
     <Grid DataContext="{StaticResource vm}">  
          <c1chart:C1Chart Height="256" HorizontalAlignment="Left" Margin="22,26,0,0" Name="c1Chart1" VerticalAlignment="Top" Width="469" DataContext="{Binding Path=SalesList}" Theme="{DynamicResource {ComponentResourceKey ResourceId=MediaPlayer, TypeInTargetAssembly=c1chart:C1Chart}}">  
               <c1chart:C1Chart.Data>  
                    <c1chart:ChartData ItemNameBinding="{Binding Path=Product}">  
                         <c1chart:DataSeries Label="Product" ValueBinding="{Binding Path=SaleValue}" ItemsSource="{Binding}" />  

                    </c1chart:ChartData>  
               </c1chart:C1Chart.Data>  
               <c1chart:C1ChartLegend DockPanel.Dock="Right" />  
          </c1chart:C1Chart>  
     </Grid>  
</Window>  

Since we load the data collection in our ViewModel's constructor, the data will be visible in the chart at design time. You can download this sample below. Download Sample