代码之家  ›  专栏  ›  技术社区  ›  Michael M.

如何在uwp列表视图中显示每个条目的总和?

  •  0
  • Michael M.  · 技术社区  · 6 年前

    以下场景 (在本例中,我对其进行了极大的简化):

    我有一个组列表。 每个组都被分配有数量的元素。

    这是我的ViewModel中的列表:

    public List<Group> Groups { get; set; }
    

    这些是我的模型:

    public class Group 
    {
        public int GroupId { get; set; }
        public string Name { get; set; }
        public Element MainElement { get; set; }
    }
    
    public class Element
    {
        public int ElementId { get; set; }
        public int GroupId { get; set; }
        public string Name { get; set; }
        public double Amount { get; set; }
    }
    

    这就是ListView的外观:

    <ListView ItemsSource="{Binding Groups}>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="{Binding Name}" />
                    <TextBlock Grid.Column="1" Text="{Binding GroupId}" />
                    <TextBlock Grid.Column="2" Text="{Binding SumOfAllItemsInThisGroup}" />
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    

    整个uwp应用程序工作得很好,但是我想在列表中显示这个组中所有元素的总和。

    我不想将值保存在数据库中。 还是非得这样?

    我试过这样的方法:

    var myGroups = new SuperGroup
    {
        Group = group,
        Amount = db.Elements.Where(e => e.Group == group).Select(e => e.Amount).Sum()
    };
    
    public class SuperGroup 
    {
        public Group Group { get; set; }
        public double SumAmount { get; set; }
    }
    

    并将绑定更改为 Text="{Binding Group.*}" 但不幸的是没有显示更多的值

    有办法使用转换器吗?

    或者你有一个非常简单的解决方案给我吗?

    0 回复  |  直到 6 年前
        1
  •  2
  •   Nico Zhu    6 年前

    但是我想在列表中显示这个组中所有元素的总和。

    你的模型结构很奇怪 Element 领域 Group 是元素但不是 List<Element> . 但是有 Amount 字段在 元素 班级。如果只想显示此字段,可以使用以下命令。

    <TextBlock Grid.Column="2" Text="{Binding Element.Amount}" />

    如果您的模型类如下所示,那么您可以添加用于记录所有元素的amount字段。

    public class Group
    {
        public int GroupId { get; set; }
        public string Name { get; set; }
        public List<Element> Elements { get; set; }
        public double SumAmount
        {
            get
            {
                return Elements.Select(e=>e.Amount).Sum();
            }               
        }
    }
    

    用法

    <TextBlock Grid.Column="2" Text="{Binding SumAmount}" />
    
        2
  •  0
  •   Michael M.    6 年前

    非常感谢@nico zhu msft,他给我带来了下面的解决方案!

    我向组中添加了一个未映射的属性,由于直接访问数据库,因此可以在没有元素列表的情况下执行此操作。

    [NotMapped]
    public double SumAmount {
        get
        {
            using (var db = new DBContext())
            {
                return db.Elements.Where(e => e.GroupId == myGroupId).Select(e => e.Amount).Sum();
            }
        }
    }
    

    就像他写的那样

    <TextBlock Grid.Column="2" Text="{Binding SumAmount}" />