如何从 Xamarin Forms 中的 ListView 集合中获取总价

How To Get Total Prices From ListView Collection in Xamarin Forms

我一直在网上寻找简单的解决方案,但似乎找不到。

我只是想从我的列表视图集合中的所有项目价格生成总价,但似乎无法弄清楚如何做到这一点。

如何将列表中的所有产品价格相加并输出到总标签上?

这是我的代码:

public ViewFBShoppingCart()
        {
            InitializeComponent();

            ObservableCollection<FBProduct> fbproducts = new ObservableCollection<FBProduct>();
            shoppingcartlistview.ItemsSource = fbproducts;

            var producttitle = "Apple";
            var productprice = ".95";
            var productimage = "image link goes here";

            var producttitle2 = "Pear";
            var productprice2 = ".95";
            var productimage2 = "image link goes here";

            fbproducts.Add(new FBProduct
            {
                ProductName = producttitle,
                ProductPrice = productprice,
                ProductImage = productimage
            }); 

            fbproducts.Add(new FBProduct
            {
                ProductName = producttitle2,
                ProductPrice = productprice2,
                ProductImage = productimage2
            });


        }

假设您遵循 MVVM 模式,首先订阅您的 collection 事件 fbproducts.CollectionChanged += fbproducts_CollectionChanged,然后在每次添加或删除项目时基于 NotifyCollectionChangedEventArgs 的方法内部应该引发新的只读 属性 的 属性 更改事件,该事件使用循环或 1 行 Linq 计算总和。

    private void fbproducts_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if(e.Action == NotifyCollectionChangedAction.Add || e.Action == NotifyCollectionChangedAction.Remove)
        {
            RaisePropertyChanged(nameof(PriceSum));
        }
    }

    public decimal PriceSum => fbproducts.Sum(x => decimal.Parse(x.ProductPrice.Substring(1)));

您还应该考虑将 ProductPrice 类型更改为 decimal 而不是 string

我建议不要使用像“$35.00”这样的格式化字符串,您可以稍后在 .xaml 文件中使用 Text="{Binding ProductPrice, StringFormat='[=11=]'} 对其进行格式化

但在那种情况下:您可以使用 Linq

string total = fbproducts.Select(a => new { Converted = Convert.ToDouble(a.ProductPrice.Replace("$", "")) }).ToList().Sum(a => a.Converted).ToString("#,0.00");
string TotalProductPrices(ObservableCollection<FBProduct> fbproducts)
{
    var total = fbproducts.Sum(x => decimal.Parse(x.ProductPrice, NumberStyles.Currency));
    return total.ToString("c");
}