WPF listview,如何获取项目总和

WPF listview, how to get sum of items

我定义了以下列表视图(其项目源是具有 AccountName 和 AccountBalance 属性的帐户集合):

<ListView x:Name="AccountList1" ItemsSource="{Binding Source={StaticResource GroupedAccounts}}" SelectedItem="{Binding SelectedAccount, Mode=TwoWay}" Margin="10" 
              IsSynchronizedWithCurrentItem="True" Background="LightGray">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="AccountName"   Width="100">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock>
                                <Hyperlink Command="{Binding DataContext.Navigate}" CommandParameter="{Binding}">
                                    <TextBlock Text="{Binding AccountName}" />
                                </Hyperlink>
                            </TextBlock>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Balance" DisplayMemberBinding="{Binding AccountBalance}"/>
                </GridView>

            </ListView.View>

此集合视图按类型对帐户进行分组:

  <CollectionViewSource Source="{Binding AccountList}" x:Key="GroupedAccounts" >
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="AccountType" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

我想显示账户总和: -所有账户的总和作为列表视图的最后一项。 -每组账户的总和。

像这样:

银行账户

账户 1 500 美元

账户 2 150 美元


总计 650 美元

现金账户

账户 3 0$

账户 4 1000 美元


总计 1000 美元


总计 1650 美元

因此,有几种方法可以处理这种情况。您可以让您的 ViewModel 处理计算并将其推送到您的视图,或者在您的模型中总共有 属性。我不知道你使用的模式,所以我不会猜测。话虽这么说,但还有一种更可重用的方法,那就是与聚合转换器一起使用,例如这里的那个:

public class SumConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          System.Globalization.CultureInfo culture)
    {
        double sum = 0.0;
        Type valueType = value.GetType();

        if(valueType.Name == typeof(List<>).Name)
        {
            foreach (var item in (IList)value)
            {
                Type itemType = item.GetType();                     
                PropertyInfo itemPropertyInfo = itemType.GetProperty((string)parameter);
                double itemValue = (double)itemPropertyInfo.GetValue(item, null); 
                sum += itemValue;
            }
            return sum;
        }
        return 0.0;
    }
    public object ConvertBack(object value, Type targetType, object parameter, 
                              System.Globalization.CultureInfo culture)
    { throw new NotImplementedException();  }
}

这是基于这篇文章:

http://www.codeproject.com/Articles/28006/Using-converters-to-aggregate-a-list-in-a-ListView

它尚未经过测试,但应该足以让您入门。