/// /// SelectedColumnChanged event delegate. /// /// Object triggering the event. /// Event arguments. public delegate void SelectedColumnChangedEventHandler(object sender, SelectedColumnChangedEventArgs e); /// /// SelectedColumnChanged event arguments. Contains the old and the newly /// selected column. /// public class SelectedColumnChangedEventArgs : EventArgs { /// /// Old selected column. /// public ColumnItem OldColumn { get; private set; } /// /// New selected column. /// public ColumnItem NewColumn { get; private set; } /// /// Constructor. /// /// Old selected column. /// New selected column. public SelectedColumnChangedEventArgs(ColumnItem oldColumn, ColumnItem newColumn) { OldColumn = oldColumn; NewColumn = newColumn; } } /// /// Extended OxyPlot ColumnSeries class. Allows selection of columns and tracks which /// column has been selected. /// public class SelectableColumnSeries : ColumnSeries, INotifyPropertyChanged { /// /// Selected ColumnItem field. /// private ColumnItem _selectedColumn; /// /// Selected ColumnItem property. /// public ColumnItem SelectedColumn { get { return _selectedColumn; } set { if (_selectedColumn != value) { var changeArgs = new SelectedColumnChangedEventArgs(_selectedColumn, value); _selectedColumn = value; NotifyPropertyChanged(); NotifySelectedColumnChanged(changeArgs); } } } /// /// Selected ColumnItem color field. /// private OxyColor _selectedColumnColor; /// /// Selected ColumnItem color property. /// public OxyColor SelectedColumnColor { get { return _selectedColumnColor; } set { _selectedColumnColor = value; NotifyPropertyChanged(); } } /// /// SelectableColumnSeries constructor. /// public SelectableColumnSeries() { MouseDown += SelectableColumnSeries_MouseDown; } /// /// MouseDown event handler for the SelectableColumnSeries. Handles changing of the selected /// ColumnItem, as well as its color, if a SelectedColumnColor was provided. If the color for /// selection was not provided, then no visual feedback is provided, but the selection is still /// made. /// /// Event sender (object). /// Event arguments (OxyMouseDownEventArgs). protected void SelectableColumnSeries_MouseDown(object sender, OxyMouseDownEventArgs e) { var nearest = GetNearestPoint(e.Position, false); var column = nearest.Item as ColumnItem; if (column == null) { return; } if (SelectedColumn != null) { SelectedColumn.Color = FillColor; } if (!SelectedColumnColor.IsUndefined()) { column.Color = SelectedColumnColor; } SelectedColumn = column; } /// /// PropertyChanged event handler. /// public event PropertyChangedEventHandler PropertyChanged; /// /// PropertyChanged event handling method. /// /// Property name. If not passed, name of the property, /// which called this method, is used. private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { if (PlotModel != null) { PlotModel.InvalidatePlot(true); } if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } /// /// SelectedColumnChanged event handler. /// public event SelectedColumnChangedEventHandler SelectedColumnChanged; /// /// SelectedColumnChanged handling method. /// /// Event arguments. Includes old column and the newly selected column. protected virtual void NotifySelectedColumnChanged(SelectedColumnChangedEventArgs e) { if (SelectedColumnChanged != null) { SelectedColumnChanged(this, e); } } } /// /// Column graph view model. /// public class ColumnGraphViewModel : ViewModelBase { /// /// Graph item observable collection field. /// private ObservableCollection _items; /// /// Graph item observable collection property. /// public ObservableCollection Items { get { return _items; } set { Set(() => Items, ref _items, value); } } /// /// Plot model field. /// private PlotModel _model; /// /// Plot model property. /// public PlotModel Model { get { return _model; } set { Set(() => Model, ref _model, value); } } /// /// Linear axis field. This is the axis on the left side, which /// provides a reference for numerical values. /// private LinearAxis _valueAxis; /// /// Linear axis property. This is the axis on the left side, which /// provides a reference for numerical values. /// public LinearAxis ValueAxis { get { return _valueAxis; } set { Set(() => ValueAxis, ref _valueAxis, value); } } /// /// Category axis field. This is the axis on the bottom, which /// provides categories for the columns. /// private CategoryAxis _bottomCategoryAxis; /// /// Category axis property. This is the axis on the bottom, which /// provides categories for the columns. /// public CategoryAxis BottomCategoryAxis { get { return _bottomCategoryAxis; } set { Set(() => BottomCategoryAxis, ref _bottomCategoryAxis, value); } } /// /// Column series field. /// private SelectableColumnSeries _series; /// /// Column series property. /// public SelectableColumnSeries Series { get { return _series; } set { Set(() => Series, ref _series, value); } } /// /// Default constructor. /// public ColumnGraphViewModel(List items, string graphTitle = "", string valueAxisTitle = "", string categoryAxisTitle = "") { Initialize(items, graphTitle, valueAxisTitle, categoryAxisTitle); } /// /// Initializes all of the properties. May be overridden. /// private void Initialize(List items, string graphTitle = "", string valueAxisTitle = "", string categoryAxisTitle = "") { Items = new ObservableCollection(items); Model = new PlotModel { Title = graphTitle, TitleColor = OxyColor.FromArgb(200, 0, 0, 0), IsLegendVisible = false }; BottomCategoryAxis = new CategoryAxis { Title = categoryAxisTitle, AxisTitleDistance = 10, TitleFontSize = 13, ItemsSource = Items, LabelField = "Label", IsZoomEnabled = false, IsPanEnabled = false, GapWidth = .2 }; Model.Axes.Add(BottomCategoryAxis); ValueAxis = new LinearAxis { Title = valueAxisTitle, AxisTitleDistance = 10, TitleFontSize = 13, Position = AxisPosition.Left, MinimumPadding = 0, AbsoluteMinimum = 0, IsZoomEnabled = false, IsPanEnabled = false }; Model.Axes.Add(ValueAxis); Series = new SelectableColumnSeries { ValueField = "Value", StrokeThickness = 1, LabelPlacement = LabelPlacement.Inside, LabelFormatString = "{0}", TextColor = OxyColor.FromArgb(255, 255, 255, 255), FillColor = OxyColor.FromArgb(200, 0, 121, 211), SelectedColumnColor = OxyColor.FromArgb(200, 76, 179, 255), TrackerFormatString = "{1}: {Value}" }; Series.Items.AddRange(Items); Model.Series.Add(Series); } }