2016-01-10 3 views
0

В WPF я построю этот код я хочу показать на DataGrid сумму «Desc» для каждого «PID»Возвращение IGrouping анонимного IEnumerable представить на DataGrid

public class Event 
{ 
    public int PID { get; set; } 
    public int Desc { get; set; } 
} 

private List<Event> data; 
public MainWindow() 
{ 
    InitializeComponent(); 
    data = new List<Event>() 
    { 
     new Event() { PID = 1, Desc=2 }, 
     new Event() { PID = 1, Desc=3 }, 
     new Event() { PID = 2, Desc=4 }, 
     new Event() { PID = 2, Desc=5 }, 
     new Event() { PID = 3, Desc=6 } 
    }; 

    var result = 
     from d in data 
     group d.Desc by d.PID into pg 
     select new { ID = pg.Key, SUM = pg.Sum() }; 

    datagrid.ItemsSource = result; 
} 

И XAML является

<DataGrid Name="datagrid" AutoGenerateColumns="False" IsReadOnly="True"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="id" Binding="{Binding ID}" Width="*"/> 
     <DataGridTextColumn Header="Name" Binding="{Binding SUM}" Width="*"/> 
    </DataGrid.Columns> 
</DataGrid> 

это хорошо работает! , но это не очень хорошо,

Что я хочу сделать, так это вернуть результат «var result» из функции и привязки, как я сделал это с DataGrid Как это сделать?

Это IEnumerable<IGrouping<int,???>> на ??? есть анонимный тип ....

так как я могу вернуть это из функции и привязки, как я сделал на DataGrid?

Спасибо!

+0

Вы можете просто вернуть 'IEnumerable', если этот метод будет использоваться для привязки списка _things_. 'private IEnumerable GetData()'. Поскольку свойство [ItemsSource] (https://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemssource (v = vs.110) .aspx) принимает 'IEnumerable', это должно быть хорошо. – Michael

ответ

1

Вам нужен класс для представления каждого элемента вашей последовательности. Таким образом, ваш результат не будет представлять собой последовательность объектов анонимного типа, но это будет последовательность объектов определенного типа.

public class Result 
{ 
    public int Id { get; set;} 
    public int Sum { get; set; } 
} 

Затем определим метод, как показано ниже:

public IEnumerable<Result> GetResults() 
{ 
    data = new List<Event>() 
    { 
     new Event() { PID = 1, Desc=2 }, 
     new Event() { PID = 1, Desc=3 }, 
     new Event() { PID = 2, Desc=4 }, 
     new Event() { PID = 2, Desc=5 }, 
     new Event() { PID = 3, Desc=6 } 
    }; 

    var result = from d in data 
       group d.Desc by d.PID into pg 
       select new Result 
       { 
        Id = pg.Key, 
        Sum = pg.Sum() 
       }; 

    return result; 
} 

, а затем в методе MainWindow вы будете вызывать этот метод.

public MainWindow() 
{ 
    InitializeComponent(); 
    datagrid.ItemsSource = GetResults(); 
} 

У меня есть supposed, что вы определили этот метод в том же классе. Вполне возможно, что это не очень хорошая практика. Поэтому, если вы определяете этот метод в другом классе, вы должны сначала создать объект этого класса, а затем вызвать метод GetResults этого объекта.

Кроме того, я попытался внести небольшое изменение в именование. Чаще всего используется имя именования верблюдов, а не буквы с буквами для всех букв. При этом вы также должны внести небольшое изменение в свой код xaml.

<DataGrid Name="datagrid" AutoGenerateColumns="False" IsReadOnly="True"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="id" Binding="{Binding Id}" Width="*"/> 
     <DataGridTextColumn Header="Name" Binding="{Binding Sum}" Width="*"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

, но как вы можете определить результат подобного это Igouping ИНТА и Anonimus типа .... как возвращающийся тип IEnumerable здесь то, что я стараюсь accorind к Ему ... – jordan

+0

В результате 'группы by' является «IGrouping». Затем вы выставляете значения «IGrouping» в последовательность «Результат». Обратите внимание, что для каждой группы pg вы создаете новый объект «Результат». Это как в вашем исходном коде. В итоге у вас не был результат «IGrouping», а последовательность объектов анонимного типа. – Christos

+0

Примечание здесь 'select new'. Вы забыли «Результат», «выберите новый результат». – Christos

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