0

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>

それはうまくいきます!しかし、これは良くない、

私がやりたいことは、DataGrid に対して行ったように、関数とバインディングからその「var 結果」を返すことです。

これはからです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 に答える