Проблемы ColumnSeries из Silverlight Charting Toolkit - PullRequest
3 голосов
/ 15 июня 2009

Я новичок в разработке Silverlight и сейчас вхожу на территорию Charting. Я следовал нескольким учебникам, показывающим, как легко связать ColumnSeries с источником данных с помощью ItemsSource (http://silverlight.net/forums/t/44166.aspx).

Я программно добавляю диаграмму на холст.

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. Каждый раз, когда я присваиваю ItemSource, я получаю сообщение об ошибке Sys.InvalidOperationException: ошибка ManagedRuntimeError # 4004 в элементе управления «Xaml1»: System.NullReferenceException System.NullReferenceException: объект не установлен для экземпляра объекта. в System.Windows.Control.DataVisualization.Charting.ColumnSeries. <> c__DisplayClass8.b__4 ()

Пожалуйста, помогите, эта ошибка сводит меня с ума !!!

Ответы [ 3 ]

1 голос
/ 15 июня 2009

Попробуйте переместить назначение 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>
0 голосов
/ 26 марта 2013
<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;
0 голосов
/ 25 августа 2010

Убедитесь, что ваша первая точка данных не содержит ноль / ничего в зависимом значении. Ошибка возникает, когда диаграмма пытается «определить» тип требуемых зависимых осей, и не удается.

   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)

Кажется, нет обходного пути. Одним из вариантов является создание подкласса LinearAxis, который переопределяет CanPlot (значение). В настоящее время NumericAxis.CanPlot завершается ошибкой для значения == 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...