2014-01-31 2 views
0

Итак, заголовок говорит все.Создание Infragistics XamDataChart с программным обеспечением с несколькими столбцами.

У меня есть цикл, который пересекает графику, которые отправляются мне.

Каждый объект графа имеет одну или несколько серий в нем объектов, которые содержат метку, datapoint и подсказку.

Каждая серия должна быть отдельной строкой на графике.

Так, например, я мог бы иметь объект серии как

Series 1

Название: 2013

Объект

label-Jan 

Value-200 

ToolTip-Value = 200 

Объект

label-Feb 

Value-400 

ToolTip-Value = 400 

И вторая серия

Series 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;     
       } 

Это аналогичный предполагаемый outcom e enter image description here

ответ

1

Таким образом, ответ на вышеуказанную проблему был довольно простым. 99% необходимых элементов уже есть

Вместо того, чтобы динамически создавать коллекцию точек данных и столбцов одновременно. Разделение их работало очень хорошо.

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 

} 
Смежные вопросы