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
它尚未经过测试,但应该足以让您入门。
我定义了以下列表视图(其项目源是具有 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
它尚未经过测试,但应该足以让您入门。