0

在 WPF 上,我构建了这个代码,我想在 datagrid 上显示每个“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 上那样从函数和绑定中返回它呢?

谢谢!

4

1 回答 1

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>
于 2016-01-10T19:07:07.653 回答