Выпуск обязательной переменной Blazor - PullRequest
1 голос
/ 25 марта 2020

В моем проекте 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 с текстовым полем, тоже самое. Я не мог придумать способ, установив текстовое поле с моим первоначально рассчитанным значением, а затем позволил пользователю изменить его при необходимости.

Помогите, пожалуйста.

Спасибо!

Франк

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Я пытался воспроизвести вашу проблему, но без полного повторения вашего кода я не могу определить, что не так, или принять ваше заключение. Ниже приведен фрагмент кода, который хорошо работает, и обновите поле 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; }
 }
} 
1 голос
/ 25 марта 2020

Установите значение в методе OnInitialized или OnInitializedAsync:

protected override void OnInitialized()
{
    PackageObject.Price = PackageObject.PackageProducts.Sum(x => x.Product.Price * x.Qty);
}
...