【问题标题】:How to display in UWP ListView the sum of every single entry?如何在 UWP ListView 中显示每个条目的总和?
【发布时间】:2019-07-13 12:52:55
【问题描述】:

以下场景 (我为这个例子做了很大的简化):

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

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

有没有办法使用转换器?

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

【问题讨论】:

    标签: .net listview uwp binding


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      你的模型结构很奇怪,GroupElement 字段是 Element 而不是 List&lt;Element&gt;。但是Element 类中有Amount 字段。如果您只想显示此字段,则可以使用以下。

      &lt;TextBlock Grid.Column="2" Text="{Binding Element.Amount}" /&gt;

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

      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}" />
      

      【讨论】:

      • 感谢您的回复!对不起,昨天来晚了,我编辑了我的帖子。所以 Group 中的 Element 只是 MainElement,只有元素知道组 ID,组本身没有元素列表。但我喜欢你的想法,我只是在 getter 中对该组中的元素进行数据库选择以获取总和
      • @MichaelM。干得好,如果回答有帮助,请考虑采纳。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2016-03-22
      • 2021-02-16
      • 2021-02-06
      • 2018-01-22
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多