Blazor: возможно ли привязать элемент c к свойству по его имени, используя отражение? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь получить шаблон редактора c, использующий Blazor, который привязывается к свойствам, найденным по отражению, следующим образом:

@typeparam TItem

@foreach (var propertyName in FieldsList) {
    <div>
        <InputText id="name" @bind-Value="@getBindProperty(propertyName)" />
    </div>
}

@functions {
    [Parameter]
    public TItem ItemEditModel { get; set; }

    public string[] FieldsList {
        get {
            // get all properties decorated with some custom attribute...
            return typeof(TItem).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(MyCustomAttribute))).Select(x => x.Name).ToArray();
        }
    }

    public string getBindProperty(string propName) {
        return string.Format("{0}.{1}", nameof(ItemEditModel), propName);
    }
}

Выше не принимается как Левая рука сторона присвоения должна быть переменной, свойством или индексатором .

Поэтому я не могу привязать свойство к его имени, поэтому я продолжал пробовать другой синтаксис, например

<InputText id="name" @bind-Value="ItemEditModel.propertyName" />

Это также не принимается, так как TItem не содержит определения 'propertyName' .

Хорошо, все вышесказанное имеет смысл - но ключевой вопрос - есть ли что-то, что с этим нужно сделать, или невозможно привязать элемент управления к свойству по его имени?

БОНУСНЫЙ ВОПРОС: Если это действительно возможно, есть ли способ сделать переключение в зависимости от тип свойства (как правило, только такие атомы c, как «string», «DateTine», «int »,« double »,« bool »...)?

1 Ответ

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

Если вы используете компонент InputText Blazor, вы должны обернуть его компонентом EditForm Blazor.

Альтернативный способ сделать это может быть следующим. @typeparam TItem

    @foreach (var propertyName in FieldsList)
    {
       <div>
          <input @bind="PropertyVars[propertyName]" />
       </div>
    }

    <button type="button" @onclick="OnSubmit">Reset</button>

    @code {
        [Parameter]
        public TItem ItemEditModel { get; set; }

       public Dictionary<string, string> PropertyVars { get; set; } = new 
     Dictionary<string, string>();

   protected override void OnInitialized()
   {
     foreach (var propertyName in FieldsList)
     {
        var propertyInfo = ItemEditModel.GetType().GetProperty(propertyName);
        PropertyVars.Add(propertyName, 
        propertyInfo?.GetValue(ItemEditModel).ToString());
     }

  }

  public string[] FieldsList
  {
    get
    {
        return typeof(TItem).GetProperties().Select(x => x.Name).ToArray();
    }
  }

  private void OnSubmit()
  {
    var tt = PropertyVars;

    foreach (var propertyName in FieldsList)
    {
        var propertyInfo = ItemEditModel.GetType().GetProperty(propertyName);

        var uu = PropertyVars[propertyName].GetType();

        if (uu == propertyInfo?.PropertyType)
        {
            propertyInfo.SetValue(ItemEditModel, 
            Convert.ChangeType(PropertyVars[propertyName], propertyInfo.PropertyType),
            null);
        }

    }

    var yy = ItemEditModel;
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...