在我的Blazor项目中,我有一个简单的输入文本框,我想在其中绑定到产品价格值。价格最初计算为:
PackageObject.Price = PackageObject.PackageProducts.Sum(x => x.Product.Price * x.Qty);
然后将变量绑定到文本框:
<input class="form-control" type="text" @bind="@PackageObject.Price" placeholder="Package Price" />
这里的目标是将初始值设置为计算值,然后允许用户使用文本框对其进行更改。
但是,我根本无法更改该值!假设计算出的价格为800,我想将其更改为其他价格,它将立即将值更改回800!
由于计算,我认为它与对象相关。在不更改对象自己的基础定价的情况下,此计算出的价格将始终反映计算的内容。但是我随后将其更改为使用类似的变量;
var price = PackageObject.PackageProducts.Sum(x => x.Product.Price * x.Qty);
然后,将变量@price绑定到文本框,同样。我无法通过将文本框设置为最初计算出的值然后让用户根据需要进行更改来解决问题。
请帮助。
谢谢!
坦率
用OnInitialized
或OnInitializedAsync
方法设置值:
protected override void OnInitialized()
{
PackageObject.Price = PackageObject.PackageProducts.Sum(x => x.Product.Price * x.Qty);
}
我已经尝试重现您的问题,但是如果没有完整的代码回购,我将无法确定问题所在或接受您的结论。下面是一个运行良好的代码段,并按预期更新PackageObject.Price字段。请注意,计算是在OnInitialized生命周期方法中进行的,该方法仅发生一次,这也许就是为什么我的示例可以正常工作的原因。但是我对此并不完全确定。
<input class="form-control" type="text" @bind="@_PackageObject.TotalPrice"
placeholder="Package Price" />
<input type="button" @onclick="@(() => { })" value="Refresh page"/>
<p>@_PackageObject.TotalPrice</p>
@code
{
PackageObject _PackageObject = new PackageObject();
protected override void OnInitialized()
{
_PackageObject.ID = 1;
_PackageObject.TotalPrice = _PackageObject.PackageProducts.Sum(p =>
p.Price * p.Qty);
Console.WriteLine(_PackageObject.TotalPrice);
}
public class PackageObject
{
public int ID { get; set; }
public int TotalPrice { get; set; }
public List<Product> PackageProducts { get; set; } =
Enumerable.Range(1, 5).
Select(i => new Product { ID = i, Price = 50, Qty=10 }).ToList();
}
public class Product
{
public int ID { get; set; }
public int Price { get; set; }
public int Qty { get; set; }
}
}