DataGrid - 显示从当前行的网格顶部运行总计

时间:2010-07-07 20:20:21

标签: wpf datagrid wpftoolkit collections

如何显示DataGrid中显示的每条记录的特定列的运行总计?我想将计算逻辑保留在视图模型中。

期望的输出:

Value      | Running Total
25           25
10           35
-2           33

谢谢你,

编辑请记住,当用户触发的DataGrid排序发生时,必须重新计算运行总计,因为记录显示顺序已更改。

我真的想把这个逻辑放在视图模型中,而不是在WPF代码中(例如不使用IValueConverter)。

6 个答案:

答案 0 :(得分:0)

我不知道有一种推荐/支持/简单的方法来做到这一点。我能想到的选择是:
1)在数据网格之外有一些ui元素来保存总数。这很容易绑定到您的VM,但要解决将出现的对齐问题有点痛苦,因为您可能希望在列下完全正确。这就是我的建议 2)在网格中有一个虚拟的最后一行;这解决了对齐问题,但为虚拟机添加了黑客逻辑,并且可能看起来不那么好。

HTH,
Berryl

答案 1 :(得分:0)

如果您不介意在VB或C#中回答,那么this tutorial会显示如何在VB中执行您想要的操作,this tutorial在C#中显示它。两者都在网格中使用虚拟列。

答案 2 :(得分:0)

查看此答案,了解如何将行计数列添加到ListBox并使用值转换器填充。而不是计算项目,加上项目的总和。如果您需要VM中的总和,这当然不是一个好的解决方案。

Numbered listbox

答案 3 :(得分:0)

唯一的想法是:实际上,DataGrid使用ICollectionView接口(http://msdn.microsoft.com/en-us/library/system.componentmodel.icollectionview.aspx)来实现排序(如http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid(VS.95).aspx分组,排序和过滤部分所述。< / p>

因此,您可以创建实现ICollectionView接口的类,并通过相应的运行总计更新来观察排序。

答案 4 :(得分:0)

我最终通过扩展DataGrid以暴露一个属性来解决这个问题,该属性可以绑定到视图模型上的“度假已发生”回调。

详细信息:http://bengribaudo.com/blog/2010/07/14/3/datagrid-per-row-running-totals

答案 5 :(得分:0)

long cumulative = 0;
List<int> Values = GetValues();
Values.ForEach(v => v.RunningTotal = cumulative = cumulative + v.Value);

您可以对整个列表运行 foreach ,并通过公式
来获得运行总计 (RunningTotal =累积=累积+值);
我们需要连续保存以前的值。