在我的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绑定到文本框,这是一样的。我想不出一种方法,用我最初计算的值设置文本框,然后让用户根据需要更改它。
请帮忙。
谢谢!
Frank
在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; }
}
}