【问题标题】:ColumnSeries from Silverlight Charting Toolkit problemsSilverlight Charting Toolkit 中的 ColumnSeries 问题
【发布时间】:2009-06-15 11:48:56
【问题描述】:

我是 Silverlight 开发的新手,目前正涉足 Charting 领域。 我一直在关注几个教程,这些教程展示了使用 ItemsSource (http://silverlight.net/forums/t/44166.aspx) 将 ColumnSeries 绑定到数据源是多么容易。

我正在以编程方式将图表添加到画布。

Chart BudgetChart = new Chart { Title = "budget", MaxHeight= 200, MaxWidth=500};
ColumnSeries cs = new ColumnSeries();
BudgetChart.Series.Add(cs);
cs.Title = "blarg";
cs.ItemsSource = o.Budget; //returns List<Budget>
cs.IndependentValueBinding = new System.Windows.Data.Binding("Budget");
cs.DependentValueBinding = new System.Windows.Data.Binding("Year");

这段代码编译得很好。但是,当我调试它时,会抛出此错误 但是,我在使用 ItemsSource 时遇到了很多困难。每次分配 ItemsSource 时,我都会收到一条错误消息,指出它是 Sys.InvalidOperationException: ManagedRuntimeError error #4004 in control 'Xaml1': System.NullReferenceException System.NullReferenceException: Object not set to an instance of an object。在 System.Windows.Control.DataVisualization.Charting.ColumnSeries.c__DisplayClass8.b__4()

请帮忙,这个错误快把我逼疯了!!!

【问题讨论】:

    标签: silverlight charts


    【解决方案1】:

    尝试将 ItemsSource 分配移到绑定之后。还可以在配置绑定后将系列添加到图表中。

    Chart BudgetChart = new Chart { Title = "budget", MaxHeight= 200, MaxWidth=500};
    ColumnSeries cs = new ColumnSeries();
    cs.Title = "blarg";
    cs.IndependentValueBinding = new System.Windows.Data.Binding("Budget");
    cs.DependentValueBinding = new System.Windows.Data.Binding("Year");
    
    BudgetChart.Series.Add(cs);
    
    cs.ItemsSource = o.Budget; //returns List<Budget>
    

    【讨论】:

    • 您好 AnthonyWJones,感谢您的回复。我尝试按照您的建议进行操作,但问题仍然存在。还有什么我可以尝试的建议吗?
    • 如果有任何帮助,我正在使用工具包的 3 月版本。
    • 我终于学会了阅读。我装错了。我对 Dependent 和 Independent 绑定感到困惑。感谢您的帮助 AnthonyWJones。
    【解决方案2】:

    确保您的第一个数据点在依赖值中不包含 null/Nothing。 当图表尝试“嗅探”所需的相关轴的类型并失败时,就会发生错误。

       at System.Windows.Controls.DataVisualization.Charting.DataPointSeriesWithAxes.GetAxes(DataPoint firstDataPoint, Func`2 independentAxisPredicate, Func`1 independentAxisFactory, Func`2 dependentAxisPredicate, Func`1 dependentAxisFactory)
    

    在 System.Windows.Controls.DataVisualization.Charting.ColumnSeries.GetAxes(DataPoint firstDataPoint)

    似乎没有解决方法。一种选择是对覆盖 CanPlot(value) 的 LinearAxis 进行子类化。目前 NumericAxis.CanPlot 因 value==null 而失败

     /// <summary>
        /// Returns a value indicating whether a value can plot.
        /// </summary>
        /// <param name="value">The value to plot.</param>
        /// <returns>A value indicating whether a value can plot.</returns>
        public override bool CanPlot(object value)
        {
            double val;
            return ValueHelper.TryConvert(value, out val);
        }
    

    【讨论】:

      【解决方案3】:
      <toolkit:Chart Grid.Row="1" Margin="10" Name="columnChart" Grid.Column="0" Width="400" ScrollViewer.HorizontalScrollBarVisibility="Visible">
                      <toolkit:Chart.Series>
                          <toolkit:ColumnSeries 
                              IndependentValueBinding="{Binding Path=Value}" 
                                           DependentValueBinding="{Binding Path=Key}" IsHitTestVisible="True" IsSelectionEnabled="True" SelectionChanged="ColumnSeries_SelectionChanged">
                          </toolkit:ColumnSeries>
                      </toolkit:Chart.Series>
                      <toolkit:Chart.Template>
                          <ControlTemplate TargetType="toolkit:Chart">
                              <chartingPrimitivesToolkit:EdgePanel x:Name="ChartArea">
                                  <Grid Canvas.ZIndex="-1" Style="{TemplateBinding PlotAreaStyle}" />
                                  <Border Canvas.ZIndex="10" BorderBrush="#FF919191" BorderThickness="1" />
                              </chartingPrimitivesToolkit:EdgePanel>
                          </ControlTemplate>
                      </toolkit:Chart.Template>
                      <toolkit:Chart.Axes>
                          <toolkit:LinearAxis Orientation="Y" Minimum="0" Maximum="100" Interval="10" />
                      </toolkit:Chart.Axes>
                  </toolkit:Chart>
      
      List<KeyValuePair<int, string>> lkvpGraph1 = new List<KeyValuePair<int, string>> { };
                  KeyValuePair<int, string> kvpGraph1 = new KeyValuePair<int, string>();
      
                  List<string> lstJob = new List<string>();
                  lstJob = lR1Acceptance.Where(r1 => r1.FCode == Facility).Select(r1 => r1.Job_No).Distinct().ToList();
                  double nWeeks = Math.Round((dtToDate - dtFromDate).Days / 7.0, 0);
                  nWeeks++;
      
                  foreach (string job_no in lstJob)
                  {
                      int TotalSubmission = lR1Acceptance.Where(rr => rr.Job_No == job_no).Count();
                      int TotalR1Accepted = lR1Acceptance.Where(rr => rr.Round_No == 1 && rr.Result == "A" && rr.Job_No == job_no).Count();
                      int dAcceptance = (int)Math.Round(TotalR1Accepted * 100.0 / TotalSubmission, 0);
                      if (TotalSubmission != 0)
                      {
                          kvpGraph1 =
                                   new KeyValuePair<int, string>(dAcceptance, job_no);
                          lkvpGraph1.Add(kvpGraph1);
                      }
      
                  }
                  ((ColumnSeries)columnChart.Series[0]).ItemsSource = lkvpGraph1;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多