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>> 方法?
这是我让它发挥作用的方法。
首先,创建一个名为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,所以我将其固定为字符串、十进制、日期时间...它很难看,但这是我目前能想到的最佳解决方案。我希望有人能够启发我更好的解决方案。
| 归档时间: |
|
| 查看次数: |
1986 次 |
| 最近记录: |