如何从 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");
}
我一直在网上寻找简单的解决方案,但似乎找不到。
我只是想从我的列表视图集合中的所有项目价格生成总价,但似乎无法弄清楚如何做到这一点。
如何将列表中的所有产品价格相加并输出到总标签上?
这是我的代码:
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");
}