C# 使用多个列系列以编程方式创建Infragistics XamDataChart

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

所以标题说明了一切

我有一个循环,循环发送给我的图形

每个图形对象都有一个或多个包含标签、数据点和工具提示的对象系列

每个系列都需要是图形上的一个单独的条形图

例如,我可能有一个系列对象,比如

系列1

标题:2013

对象

 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
}