所以标题说明了一切。
我有一个循环遍历发送给我的图表。
每个图形对象都有一个或多个包含标签、数据点和工具提示的对象系列。
每个系列都需要是图表上的单独条形。
因此,例如,我可能有一个系列对象,例如
系列一
标题:2013
目的
label-Jan Value-200 ToolTip-Value = 200
目的
label-Feb Value-400 ToolTip-Value = 400
还有第二个系列
系列 2
标题:2014
目的
label-Jan Value-100 ToolTip-Value = 100
目的
label-Feb Value-300 ToolTip-Value = 300
每个系列都需要是图表上的单独条形颜色。
尽管我尽了最大努力,但我似乎无法以编程方式实现这一点。
需要假设返回的系列数量未知,数据点数量未知,因为此控件用于多个位置。
我存储每个点的对象
public class XamDataChartItem: INotifyPropertyChanged
{
private String _label;
public String Label
{
get { return _label; }
set { _label = value; }
}
private double _yPoint;
public double YPoint
{
get { return _yPoint; }
set { _yPoint = value; OnPropertyChanged("YPoint"); }
}
private String _ToolTip;
public String ToolTip
{
get { return _ToolTip; }
set { _ToolTip = value; OnPropertyChanged("ToolTip"); }
}
void OnPropertyChanged(String prop)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
我将每个点存储在List<XamDataChartItem>
private List<XamDataChartItem> _dataCollection;
public List<XamDataChartItem> dataCollection
{
get { return _dataCollection; }
set { _dataCollection = value; OnPropertyChanged("dataCollection"); }
}
我的顶起方法不会创建多个条形,并且不会在 X 轴上放置正确的标签
ChartControl control = o as ChartControl;
if (control == null)
return;
ElementList list = args.NewValue as ElementList;
if (list != null && list.Count >= 1)
{
control.dataCollection.Clear();
foreach (Element data in list)
{
List<XamDataChartItem> NewBarSeries = new List<XamDataChartItem>();
CategoryXAxis catX = new CategoryXAxis()
{
Name = "catX",
ItemsSource = NewBarSeries,
Label = "{}{Label}",
Gap = 10
};
NumericYAxis numY = new NumericYAxis()
{
Name = "numY",
ToolTip = "{Binding ToolTip}"
};
foreach (var point in (data["DataPoints"] as ElementList))
{
var label = point["Label"];
var value = point["Value"];
var toolTip = point["ToolTip"];
var legend = data["LegendLabel"];
if (legend != null)
{
control.Legend = legend.ToString();
control.isLegVis = true;
}
XamDataChartItem item = new XamDataChartItem()
{
Label = label.ToString(),
YPoint = double.Parse(value.ToString()),
ToolTip = toolTip.ToString()
};
NewBarSeries.Add(item);
}
ColumnSeries cs = new ColumnSeries()
{
Title = data["LegendLabel"],
ItemsSource = NewBarSeries,
ValueMemberPath = "YPoint",
XAxis = catX,
YAxis = numY
};
control.masterCollection.Add(NewBarSeries);
if (control.chart.Axes.Count == 0)
{
control.chart.Axes.Add(catX);
control.chart.Axes.Add(numY);
}
control.chart.Series.Add(cs);
//Hack to refresh the DataContext
//For some reason Observable Collections don't update with this control
//You cannot set the Mode it's read only
//Invoking OnPropertyChanged from control doesn't work either
control.DataContext = null;
control.DataContext = control;
}
这是一个类似的预期结果