Blazor绑定变量问题



在我的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

OnInitializedOnInitializedAsync方法中设置值:

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; }
}
} 

最新更新