如何在UWP ListView中显示每个条目的总和?

时间:2019-02-19 22:43:21

标签: .net listview uwp binding

以下情况 (在此示例中,我已对其进行了大大简化):

我有一个团体名单。 每个组都分配有数量的元素。

这是我的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.*}" 但不幸的是,没有显示更多的值

是否可以使用转换器?

或者您对我有一个非常简单的解决方案?

2 个答案:

答案 0 :(得分:2)

  

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

您的模型结构很奇怪,Element的{​​{1}}字段是Element而不是Group。但是List<Element>类中有Amount字段。如果您只想显示此字段,则可以使用以下命令。

Element

如果您的模型类如下,则可以添加SumAmount字段,该字段用于记录所有元素的数量。

<TextBlock Grid.Column="2" Text="{Binding Element.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();
        }               
    }
}

答案 1 :(得分:0)

非常感谢@ 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}" />