You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Maui中如何在按日期分组的CollectionView组头显示总金额

实现.NET Maui分组列表组头显示总金额

步骤1:扩展分组模型,添加总金额属性

修改ExpensesGroupModel,新增TotalAmount属性,在构造函数中自动计算当前组内所有费用的总和(处理Amount为null的情况,默认按0计算):

// 费用分组模型,继承自ExpensesDetailModel列表
public class ExpensesGroupModel : List<ExpensesDetailModel>
{
    public DateTime ExpensesDate { get; set; }
    // 新增组内总金额属性
    public double TotalAmount { get; set; }

    public ExpensesGroupModel(DateTime expensesDate, List<ExpensesDetailModel> expensesList) : base(expensesList)
    {
        ExpensesDate = expensesDate;
        // 累加组内所有费用金额,null值按0处理
        TotalAmount = expensesList.Sum(item => item.Amount ?? 0);
    }
}

步骤2:保留原有分组逻辑

ViewModel中的分组代码无需修改,因为分组模型的构造函数已经自动完成了总金额计算:

// 在ViewModel中按日期分组
var dic = MonthlyExpensesList.GroupBy(x => x.ExpensesDate.Date).ToDictionary(d => d.Key, d => d.ToList());

foreach (KeyValuePair<DateTime, List<ExpensesDetailModel>> item in dic)
{
    MonthlyGroupExpensesList.Add(new ExpensesGroupModel(item.Key, new List<ExpensesDetailModel>(item.Value)));
}

步骤3:修改XAML组头模板,绑定总金额

更新CollectionView的组头模板,添加总金额标签并调整布局,让日期和总金额分别居左、居右:

<CollectionView Margin="10,8" ItemsSource="{Binding MonthlyGroupExpensesList}" IsGrouped="True">
    <CollectionView.GroupHeaderTemplate>
        <DataTemplate x:DataType="models:ExpensesGroupModel">
            <Frame Margin="0,5" Padding="10" HeightRequest="50" BorderColor="Transparent"
                BackgroundColor="Bisque">
                <HorizontalStackLayout HorizontalOptions="FillAndExpand">
                    <!-- 显示分组日期 -->
                    <Label Text="{Binding ExpensesDate,StringFormat='{0:d}'}" FontSize="18"
                        TextColor="Black" FontAttributes="Bold" />
                    <!-- 显示组内总金额,靠右对齐 -->
                    <Label Text="{Binding TotalAmount,StringFormat='Total: {0:n2}'}" 
                        FontSize="18" TextColor="Black" FontAttributes="Bold"
                        HorizontalOptions="EndAndExpand"/>
                </HorizontalStackLayout>
            </Frame>
        </DataTemplate>
    </CollectionView.GroupHeaderTemplate>

    <!-- 原有列表项模板保持不变 -->
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="models:ExpensesDetailModel">
            <Frame Margin="0" Padding="10" CornerRadius="0">
                <VerticalStackLayout>
                    <HorizontalStackLayout HorizontalOptions="Start">
                        <Label Text="{Binding ExpensesDescription}" FontSize="16"
                            FontAttributes="Bold" />
                    </HorizontalStackLayout>
                    <HorizontalStackLayout HorizontalOptions="EndAndExpand">
                        <Label Margin="0,-25" Text="{Binding Amount,StringFormat='{0:n2}'}"
                            FontSize="18" FontAttributes="Bold" TextColor="Red" />
                    </HorizontalStackLayout>
                </VerticalStackLayout>
            </Frame>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

完成上述修改后,分组列表的组头会自动显示对应日期的费用总金额,与预期效果一致。

内容的提问来源于stack exchange,提问作者Shahadath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:49:57