具有动态列的 MudBlazor

Mic*_*ger 4 c# blazor mudblazor

我想创建一种使用 MudBlazor Datagrid 中的 PropertyColumn 创建动态列的方法。

<MudDataGrid @ref=_grid Items="GetItems(Model.ModelClass.Object, Items)">
    <Columns>
   @foreach(ListViewColumn col in Listview.Columns.OrderBy(x => x.Index))
    {
        <PropertyColumn Property="@MakeExpression(col, Model.ModelClass.Object, PropertyMatch(col).PropertyType)" Title="@col.Caption" />
    }
    </Columns>
</MudDataGrid>
@code{

    Expression<Func<T, P>> MakeExpression<T, P>(ListViewColumn col, T obj, P item) where T : Type
    {  
        var text = $"x => x.{col.PropertyName}";
        return System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda<T, P>(new System.Linq.Dynamic.Core.ParsingConfig(), true, text);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,它仍然给我一个例外:类型“Type”中不存在属性或字段“String1”

String1 是 propertyName.. Model.ModelClass.Object 是反映 MudDataGrid 的 T 的类型

如何修复我的 Expression<Func<T,P>> 方法?

Eri*_*Ngo 5

这是我让它发挥作用的方法。

首先,创建一个名为DataGrid的GenericComponent,其中包含DataGrid:

@typeparam T
    
<MudDataGrid T="T" Items="@Items">
   <Columns>
    <SelectColumn T="T" />
    
 @foreach (var PInfo in typeof(T).GetProperties())
  {
   if (PInfo.PropertyType == typeof(string))
   {
    <PropertyColumn Property="@(GetStringPropertyLambdaExpression(PInfo))" />
   }
  }
 </Columns>
</MudDataGrid>

Run Code Online (Sandbox Code Playgroud)
code{

 [Parameter]
 public string Title { get; set; }

 [Parameter]
 public IEnumerable<T> Items { get; set; }

  private Expression<Func<T, string>> GetStringPropertyLambdaExpression(System.Reflection.PropertyInfo propertyInfo)
  {
      // Define a parameter for the lambda expression
      ParameterExpression param = Expression.Parameter(typeof(T), "x");

      // Create an expression to access the property
      Expression propertyAccess = Expression.Property(param, propertyInfo);


      // Create a lambda expression that takes an AType parameter and returns its Name property
      Expression<Func<T, string>> lambdaExpression = Expression.Lambda<Func<T, string>>(propertyAccess, param);

      return lambdaExpression;
  }

}
Run Code Online (Sandbox Code Playgroud)

然后我就在我的页面中使用它,如下所示:dataname 是我的数据源的名称。关于参数设置。我根据数据源的名称构建数据源。它可以是人员列表、联系人列表、产品列表......

@page "/infolist/{*dataname}"

<MudText Typo="Typo.caption"  >@dataname</MudText>

@InfoGrid

Run Code Online (Sandbox Code Playgroud)

页面的代码块,设置参数后添加我的数据网格


      protected override async Task OnParametersSetAsync()
      {
          try
          {
              await base.OnParametersSetAsync();

              if (DataNameChanged)
              {                                    
                 await vm.LoadAsync();
                 InfoGrid = AddGridView();
                 StateHasChanged();

              }

          }
          catch (Exception ex)
          {
              await alert.ShowErrorAsync(ex);
          }
      }

      private RenderFragment InfoGrid { get; set; }
          
      private RenderFragment AddGridView() => __builder =>
      {
          var ItemType = ViewModel.RowDataType;

          var sample = Activator.CreateInstance(ItemType);

          var genericType = typeof(GridView<>);

          var theGridType = genericType.MakeGenericType(ItemType);

          __builder.OpenComponent(11, theGridType);
         
          __builder.AddAttribute(23, "Items", ViewModel.Items);

          __builder.CloseComponent();

      };

Run Code Online (Sandbox Code Playgroud)

Mud PropertyColumn的Property属性是Expression<Func<T,TProperty>>。

我不知道如何或在哪里定义 TProperty,所​​以我将其固定为字符串、十进制、日期时间...它很难看,但这是我目前能想到的最佳解决方案。我希望有人能够启发我更好的解决方案。