///
/// 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);
}
}