返回要在DataGrid上显示的匿名IEnumerable的IGrouping
本文关键字:IEnumerable IGrouping 显示 DataGrid 返回 | 更新日期: 2023-09-27 18:29:39
在WPF上,我构建了以下代码我想在数据网格上显示每个"PID"的"Desc"总和
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结果",就像我对DataGrid所做的那样我该怎么做?
这是来自IEnumerable<IGrouping<int,???>>
在…上有匿名类型。。。。
那么,我如何像在DataGrid上那样从函数和绑定返回这个呢?
谢谢!
您需要一个类来表示序列中的每一项。这样,结果就不会是匿名类型的对象序列,而是特定类型的对象的序列。
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>