C# 如何通过MVVM在WPF数据网格中实现摘要行(总行)

C# 如何通过MVVM在WPF数据网格中实现摘要行(总行),c#,wpf,mvvm,row,summary,C#,Wpf,Mvvm,Row,Summary,我需要一个帮助来使用MVVM模式在WPF datagrid中创建摘要行或合计行,特别是这个摘要行的每个列都有一个值,如下图所示。第一个总计计算基于前3个项目,这些项目在一个组中。我找不到一个好的示例或示例代码来解决这个问题 请参考此图: 您可以向datagrid like或like中添加页脚行 --更新-- 如果需要行分组,请查看。。尝试理解分组和添加行组标题的概念,有几种解决方案。您的解释中没有足够的细节来选择最合适的选项 下面是一个使用转换器在DataGrid中按组汇总和设置组样式的示例 n

我需要一个帮助来使用MVVM模式在WPF datagrid中创建摘要行或合计行,特别是这个摘要行的每个列都有一个值,如下图所示。第一个总计计算基于前3个项目,这些项目在一个组中。我找不到一个好的示例或示例代码来解决这个问题

请参考此图:


您可以向datagrid like或like中添加页脚行

--更新--


如果需要行分组,请查看。。尝试理解分组和添加行组标题的概念,有几种解决方案。您的解释中没有足够的细节来选择最合适的选项

下面是一个使用转换器在DataGrid中按组汇总和设置组样式的示例

namespace TotalRows
{
    public class ItemClass
    {
        public int Group { get; set; }
        public string Title { get; set; }

        public int Y2013 { get; set; }
        public int Y2014 { get; set; }
        public int Y2015 { get; set; }
        public int Y2016 { get; set; }
    }

}
使用System.Collections.ObjectModel;
使用System.Linq;
名称空间总计行
{
公共类示例数据
{
公共静态ObservableCollection项{get;}
=新的ObservableCollection()
{
新的ItemClass(){Group=1,Title=“Item1”,Y2013=1200,Y2014=1500,Y2015=1800,Y2016=1500},
新的ItemClass(){Group=1,Title=“Item2”,Y2013=2350,Y2014=2000,Y2015=2400,Y2016=2300},
新的ItemClass(){Group=1,Title=“Item3”,Y2013=4000,Y2014=4350,Y2015=5000,Y2016=5500},
新的ItemClass(){Group=2,Title=“Item1”,Y2013=1250,Y2014=1400,Y2015=1900,Y2016=1500},
新的ItemClass(){Group=2,Title=“Item2”,Y2013=1350,Y2014=2500,Y2015=2450,Y2016=2700},
新的ItemClass(){Group=2,Title=“Item3”,Y2013=3500,Y2014=3350,Y2015=5000,Y2016=5500},
};
}
}
使用系统;
利用制度全球化;
使用System.Linq;
使用System.Windows;
使用System.Windows.Data;
使用System.Windows.Markup;
名称空间总计行
{
公共类TotalItems转换器:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
如果(值为CollectionViewGroup)
{
开关(参数)
{
案例“13”:返回组.Items.OfType().Sum(item=>item.Y2013);
案例“14”:返回组.Items.OfType().Sum(item=>item.Y2014);
案例“15”:返回组.Items.OfType().Sum(item=>item.Y2015);
案例“16”:返回组.Items.OfType().Sum(item=>item.Y2016);
}
}
返回dependencProperty.unset值;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
公共静态TotalItemsConverter实例{get;}=new TotalItemsConverter();
}
公共类TotalItemsConverterExtension:MarkupExtension
{
公共覆盖对象ProviderValue(IServiceProvider服务提供程序)
=>TotalItemsConverter.Instance;
}
}


您正在使用wpf基本数据网格吗?或者别的什么?直接把图像放在问题上,这是唯一能解决我问题的方法。有人知道如何在WPF桌面版中实现吗?谢谢你的回复,这不是我需要的根据图片,有两种类型的行,一种类似于其他行的父行(总计)。但这两行都在同一个网格视图中,我使用的是基本WPF数据网格。我已经更新了ans,请查看,如果有任何问题,请告诉我。我以前尝试过此链接。问题不在于对行进行分组,在我的网格中(可以看到group header(Total rows))也具有与其他行相同的列值类型。
using System.Collections.ObjectModel;
using System.Linq;

namespace TotalRows
{
    public class ExampleData
    {
        public static ObservableCollection<ItemClass> Items { get; }
            = new ObservableCollection<ItemClass>()
            {
                new ItemClass() {Group=1, Title="Item1", Y2013=1200, Y2014=1500, Y2015=1800, Y2016=1500},
                new ItemClass() {Group=1, Title="Item2", Y2013=2350, Y2014=2000, Y2015=2400, Y2016=2300},
                new ItemClass() {Group=1, Title="Item3", Y2013=4000, Y2014=4350, Y2015=5000, Y2016=5500},
                new ItemClass() {Group=2, Title="Item1", Y2013=1250, Y2014=1400, Y2015=1900, Y2016=1500},
                new ItemClass() {Group=2, Title="Item2", Y2013=1350, Y2014=2500, Y2015=2450, Y2016=2700},
                new ItemClass() {Group=2, Title="Item3", Y2013=3500, Y2014=3350, Y2015=5000, Y2016=5500},
            };
    }

}
using System;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

namespace TotalRows
{
    public class TotalItemsConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is CollectionViewGroup group)
            {
                switch (parameter)
                {
                    case "13": return group.Items.OfType<ItemClass>().Sum(item => item.Y2013);
                    case "14": return group.Items.OfType<ItemClass>().Sum(item => item.Y2014);
                    case "15": return group.Items.OfType<ItemClass>().Sum(item => item.Y2015);
                    case "16": return group.Items.OfType<ItemClass>().Sum(item => item.Y2016);
                }
            }

            return DependencyProperty.UnsetValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        public static TotalItemsConverter Instance { get; } = new TotalItemsConverter();
    }

    public class TotalItemsConverterExtension : MarkupExtension
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
            => TotalItemsConverter.Instance;
    }

}
<Window x:Class="TotalRows.TotalRowsWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TotalRows"
        mc:Ignorable="d"
        Title="RowsTotalWindow" Height="450" Width="800">
    <FrameworkElement.Resources>
        <CollectionViewSource x:Key="items" Source="{x:Static local:ExampleData.Items}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="Group"/>
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </FrameworkElement.Resources>
    <Grid>
        <DataGrid ItemsSource="{Binding Mode=OneWay, Source={StaticResource items}}">
            <DataGrid.GroupStyle>
                <GroupStyle>
                    <GroupStyle.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Converter={local:TotalItemsConverter}, ConverterParameter=13}" Margin="95,0,0,0"/>
                                <TextBlock Text="{Binding Converter={local:TotalItemsConverter}, ConverterParameter=14}" Margin="15,0,0,0"/>
                                <TextBlock Text="{Binding Converter={local:TotalItemsConverter}, ConverterParameter=15}" Margin="15,0,0,0"/>
                                <TextBlock Text="{Binding Converter={local:TotalItemsConverter}, ConverterParameter=16}" Margin="15,0,0,0"/>
                            </StackPanel>
                        </DataTemplate>
                    </GroupStyle.HeaderTemplate>
                </GroupStyle>
            </DataGrid.GroupStyle>
        </DataGrid>
    </Grid>
</Window>