Список обновляется при изменении модели EditForm. Как предотвратить? - PullRequest
0 голосов
/ 09 апреля 2020

В моей таблице есть список операций типа Person с именем PersonList. При щелчке по строке другому объекту (модели) типа Person присваивается значение этой строки, поэтому мой EditForm обновляется с этим значением. Пока все хорошо.

Но когда я изменяю значение te в моем EditForm, мой список также обновляется этим значением.

Как это возможно? И как это сделать?

Большое спасибо!

<h3>Component</h3>

<table>
   <thead>
       <tr>
           <th>ID</th>
           <th>Name</th>
           <th>Age</th>
       </tr>
   </thead>
   <tbody>
       @foreach (var person in PersonList)
       {
           <tr @onclick="@(() => ActivateItem(person))">
               <td>@person.Id</td>
               <td>@person.Name</td>
               <td>@person.Age</td>
           </tr>
       }
   </tbody>
</table>

<EditForm Model="Model">
    <InputText @bind-Value="Model.Name" />
    <InputNumber @bind-Value="Model.Age" />
</EditForm>


@code {

    private List<Person> PersonList = new List<Person>();
    private Person Model = new Person();

    private void ActivateItem(Person person)
    {
        Model = person;
    }

    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

    protected override void OnInitialized()
    {
        PersonList.Add(new Person
        {
            Id = 1,
            Name = "Jack",
            Age = 20
        });

        PersonList.Add(new Person
        {
            Id = 2,
            Name = "Paul",
            Age = 25
        });

        PersonList.Add(new Person
        {
            Id = 3,
            Name = "Brad",
            Age = 30
        });
    }
}

1 Ответ

1 голос
/ 09 апреля 2020

Ну, это потому, что вы сохраняете ссылку на объект, а значение привязки является двухсторонней привязкой. Совсем не странно.

Одним из решений является использование односторонней привязки, а другим решением будет удаление ссылки из объекта путем создания нового объекта. Как то так:

private void ActivateItem(Person person)
    {
        Model = new Person
        {
              Id = person.Id,
              Name = person.Name,
              Age = person.Age
         };
    }
...