C# 使用多个列系列以编程方式创建Infragistics XamDataChart
所以标题说明了一切 我有一个循环,循环发送给我的图形 每个图形对象都有一个或多个包含标签、数据点和工具提示的对象系列 每个系列都需要是图形上的一个单独的条形图 例如,我可能有一个系列对象,比如 系列1 标题:2013 对象C# 使用多个列系列以编程方式创建Infragistics XamDataChart,c#,wpf,infragistics,xamdatachart,C#,Wpf,Infragistics,Xamdatachart,所以标题说明了一切 我有一个循环,循环发送给我的图形 每个图形对象都有一个或多个包含标签、数据点和工具提示的对象系列 每个系列都需要是图形上的一个单独的条形图 例如,我可能有一个系列对象,比如 系列1 标题:2013 对象 label-Jan Value-200 ToolTip-Value = 200 label-Feb Value-400 ToolTip-Value = 400 label-Jan Value-100 ToolTip-Value = 10
label-Jan
Value-200
ToolTip-Value = 200
label-Feb
Value-400
ToolTip-Value = 400
label-Jan
Value-100
ToolTip-Value = 100
label-Feb
Value-300
ToolTip-Value = 300
对象
label-Jan
Value-200
ToolTip-Value = 200
label-Feb
Value-400
ToolTip-Value = 400
label-Jan
Value-100
ToolTip-Value = 100
label-Feb
Value-300
ToolTip-Value = 300
还有第二个系列
系列2
标题:2014
对象
label-Jan
Value-200
ToolTip-Value = 200
label-Feb
Value-400
ToolTip-Value = 400
label-Jan
Value-100
ToolTip-Value = 100
label-Feb
Value-300
ToolTip-Value = 300
对象
label-Jan
Value-200
ToolTip-Value = 200
label-Feb
Value-400
ToolTip-Value = 400
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;
}
我将每个点存储在列表中
private List\u数据采集;
公共列表数据收集
{
获取{return\u dataCollection;}
设置{u 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;
}
ChartControl=o作为ChartControl;
if(control==null)
返回;
ElementList=args.NewValue作为ElementList;
if(list!=null&&list.Count>=1)
{
control.dataCollection.Clear();
foreach(列表中的元素数据)
{
List NewBarSeries=newlist();
CategoryXAxis catX=新的CategoryXAxis()
{
Name=“catX”,
ItemsSource=NewBarSeries,
Label=“{}{Label}”,
间隙=10
};
NumericYAxis numY=新的NumericYAxis()
{
Name=“numY”,
ToolTip=“{Binding ToolTip}”
};
foreach(变量点输入(数据[“数据点”]作为元素列表))
{
变量标签=点[“标签”];
var值=点[“值”];
变量工具提示=点[“工具提示”];
变量图例=数据[“LegendLabel”];
如果(图例!=null)
{
control.Legend=Legend.ToString();
control.isLegVis=true;
}
XamDataChartItem=新的XamDataChartItem()
{
Label=Label.ToString(),
YPoint=double.Parse(value.ToString()),
ToolTip=ToolTip.ToString()
};
添加(项目);
}
ColumnSeries cs=新ColumnSeries()
{
标题=数据[“LegendLabel”],
ItemsSource=NewBarSeries,
ValueMemberPath=“YPoint”,
XAxis=catX,
YAxis=numY
};
control.masterCollection.Add(NewBarSeries);
if(control.chart.Axes.Count==0)
{
控件.图表.轴.添加(catX);
控件。图表。轴。添加(numY);
}
控制。图表。系列。添加(cs);
//黑客刷新数据上下文
//由于某些原因,可观察集合不使用此控件更新
//您无法设置模式,因为它是只读的
//从控件调用OnPropertyChanged也不起作用
control.DataContext=null;
control.DataContext=control;
}
这是一个类似的预期结果
因此,上述问题的答案非常简单。99%的所需元素已经存在 而不是试图同时动态创建数据点和collumns的集合。将它们分离非常有效
List<List<DataPointObjects>> MasterList
method NewDataReceived(args){
foreach Chart{
new List<DataPointObjects> temp;
Loop through data{
Create new data point objects
add them to temp
}
add temp to MasterList
}
// Now that we have all of our chart points
Create xAxis
Create yAxis
Foreach chart in MasterList
{
Assign xAxis data
Assign yAxis data
Build a ColumnSeries
assign it x and y axis
if chart doesnt contain these axises then add them
if chart series doesnt containt this new series then add it
}
chart.datacontext = null
chart.datacontext = this
}
列表主列表
方法NewDataReceived(args){
foreach图{
新名单;
循环浏览数据{
创建新的数据点对象
将它们添加到temp中
}
将临时文件添加到主列表
}
//现在我们有了所有的图表点
创建xAxis
创建yAxis
主列表中的Foreach图表
{
分配xAxis数据
分配yAxis数据
建立一个专栏系列
将其指定为x轴和y轴
如果图表不包含这些轴,则添加它们
如果图表系列不包含此新系列,则添加它
}
chart.datacontext=null
chart.datacontext=this
}