Создание круговой диаграммы в Silverlight - PullRequest
0 голосов
/ 03 марта 2011

Я создаю панель управления в Silverlight. Я пытаюсь создать круговую диаграмму следующим образом:

<ria:DomainDataSource AutoLoad="True" Name="orderDomainDataSource" 
  QueryName="GetOrdersQuery">
  <ria:DomainDataSource.DomainContext>
    <my:PresentationDomainContext />
  </ria:DomainDataSource.DomainContext>
</ria:DomainDataSource>
<toolkit:Chart Name="chart1" Title="">
  <toolkit:Chart.Series>
   <toolkit:PieSeries 
     ItemsSource="{Binding ElementName=orderDomainDataSource, Path=Data}" 
     IndependentValueBinding="{Binding Path=OrderDate.Month}" 
     DependentValueBinding="{Binding Path=TotalAmount}" />
  </toolkit:Chart.Series>
</toolkit:Chart>

Мой источник данных имеет сотни заказов. Заказы охватывают три месяца. Я хочу сгруппировать кусочки пирога по месяцам. По этой причине я установил для IndependentValueBinding значение OrderDate.Month. Однако я заметил, что элементы не группируются автоматически. Как декларативно сгруппировать данные по месяцам, чтобы показать суммы таким образом?

Большое спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Диаграмма в наборе инструментов предназначена только для представления диаграммы предоставленных данных.Он не выполняет для вас никакого агрегирования, вам нужно будет сделать это с данными, прежде чем предоставлять их на диаграмму.

В этом случае вам необходимо создать новый метод запроса, который выполняет суммирование, которое возвращает коллекциюсодержать только один объект в месяц с общей суммой за месяц.

1 голос
/ 08 сентября 2011

Предположим, что в вашем OrderTable (как DataSource) есть два столбца с именами OrderDate и TotalAmount.

Теперь вам нужно написать запрос для группировки ваших данных по месяцам.Поскольку у вас есть данные, хранящиеся за 3 месяца определенного года, вам, возможно, не придется заботиться о году здесь.Таким образом, запрос LINQ для расчета общей суммы за месяц может быть таким:* Здесь, в этом примере, результаты извлекаются из заказов в виде пары «имя-значение» и кумулятивно сохраняются в totalAmountByMonth.это тогда связано с диаграммой, делая AxisXLabel как Месяц и Сумма как YValue.Вот код ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Visifire.Charts;

namespace BindingDemo
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            // Temp list of orders
            List<Order> orders = new List<Order>();

            orders.Add(new Order() { Date = new DateTime(2010, 1, 1), Amount = 1213 });
            orders.Add(new Order() { Date = new DateTime(2010, 1, 3), Amount = 1273 });
            orders.Add(new Order() { Date = new DateTime(2010, 1, 4), Amount = 1253 });
            orders.Add(new Order() { Date = new DateTime(2010, 1, 5), Amount = 213 });
            orders.Add(new Order() { Date = new DateTime(2010, 1, 5), Amount = 1300 });

            orders.Add(new Order() { Date = new DateTime(2010, 2, 1), Amount = 1213 });
            orders.Add(new Order() { Date = new DateTime(2010, 2, 3), Amount = 1255 });
            orders.Add(new Order() { Date = new DateTime(2010, 2, 4), Amount = 1290 });
            orders.Add(new Order() { Date = new DateTime(2010, 2, 5), Amount = 1731 });
            orders.Add(new Order() { Date = new DateTime(2010, 2, 5), Amount = 2173 });

            orders.Add(new Order() { Date = new DateTime(2010, 3, 1), Amount = 1213 });
            orders.Add(new Order() { Date = new DateTime(2010, 3, 3), Amount = 1243 });
            orders.Add(new Order() { Date = new DateTime(2010, 3, 4), Amount = 1263 });
            orders.Add(new Order() { Date = new DateTime(2010, 3, 5), Amount = 1273 });
            orders.Add(new Order() { Date = new DateTime(2010, 3, 5), Amount = 1233 });

            var totalAmountByMonth = (from record in orders
                                      group record by record.Date.Month
                                          into groupedOrder
                                          select new KeyValuePair<String, Double>(groupedOrder.First().Date.ToString("MMMM"),
                                              groupedOrder.Sum(a => a.Amount)));

            // Setting DataContext of Chart
            chart.DataContext = totalAmountByMonth;

        }

        public class Order
        {
            public DateTime Date;
            public int Amount;

        }
    }
}

: XAML:

<vc:Chart Name="chart" Width="500" Height="300" Theme="Theme1" View3D="True">
    <vc:Chart.Series>
        <vc:DataSeries RenderAs="Pie" DataSource="{Binding}">
            <vc:DataSeries.DataMappings>
                <vc:DataMapping MemberName="AxisXLabel" Path="Key"></vc:DataMapping>
                <vc:DataMapping MemberName="YValue" Path="Value"></vc:DataMapping>
            </vc:DataSeries.DataMappings>
        </vc:DataSeries>
    </vc:Chart.Series>
</vc:Chart>

Выход:

enter image description here

...