我正在使用 mudDataGrid 来显示我的数据(IEnumerable),它工作正常。 我还启用了可过滤功能来过滤列,但是过滤行和列菜单都不起作用! 过滤器行被禁用(只读),并且在列菜单中,运算符列表为空并且没有值字段! (参见我的附图)。
这是我的代码:
<MudDataGrid T="DataRow" Items="this._lstRows" Filterable="true" FilterMode="DataGridFilterMode.ColumnFilterRow" QuickFilter="@FilterFunc">
<ToolBarContent>
<MudText Typo="Typo.h6" Class="persianFontSans">@Report.ReportPersianName</MudText>
<MudSpacer />
<MudTextField @bind-Value="_searchString" Placeholder="Search" Adornment="Adornment.Start" Immediate="true"
AdornmentIcon="@Icons.Material.Filled.Search" IconSize="MudBlazor.Size.Medium" Class="mt-0 persianFontSans"></MudTextField>
</ToolBarContent>
<Columns>
@foreach (var dc in this.Data.Columns.OfType<DataColumn>())
{
<PropertyColumn Property="x => x[dc.ColumnName]" Title="@dc.ColumnName" HeaderClass="persianFontSans" CellClass="persianFontSans"
Format="@GetFormatString(dc)" />
}
</Columns>
<PagerContent>
<MudDataGridPager T="DataRow" />
</PagerContent>
</MudDataGrid>
问题出在哪里,如何解决? 预先感谢
PropertyColumn
不适用于像 ExpandoObject
这样的动态场景。它严格适用于在设计时已知属性的模型,即强类型模型,不适用于涉及 foreach
循环的用例。
它无法确定像
x => x[dc.ColumnName]
这样的表达式的类型。您需要编写自己的Column
,类似于此代码,但不使用表达式,您可以在其中以不同的方式提供类型。
例如,如果你想使用
DataColumn
,你可以这样做:
<MudDataGrid T="DataRow" Items="@Rows" Filterable="true">
<Columns>
@foreach (var dc in Columns)
{
<DynamicColumn Content="x => x[dc.ColumnName]" DataType="@dc.DataType" Title="@dc.ColumnName" />
}
</Columns>
</MudDataGrid>
@code
{
private static IEnumerable<DataColumn> Columns = GetTable().Columns.OfType<DataColumn>();
private static IEnumerable<DataRow> Rows = GetTable().Rows.OfType<DataRow>();
static DataTable GetTable()
{
DataTable table = new DataTable();
table.Columns.Add("Number", typeof(int));
table.Columns.Add("Sign", typeof(string));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Position", typeof(int));
table.Columns.Add("Molar", typeof(double));
// Add rows.
table.Rows.Add(1, "H", "Hydrogen", 0, 1.00794d);
table.Rows.Add(2, "He", "Helium", 17, 4.002602d);
table.Rows.Add(3, "Li", "Lithium", 0, 6.941d);
table.Rows.Add(4, "Be", "Beryllium", 1, 9.012182d);
return table;
}
}
public partial class DynamicColumn<T> : Column<T>
{
[Parameter]
public Type DataType { get; set; }
[Parameter]
public Func<T, object> Content { get; set; }
protected internal override object CellContent(T item) => Content?.Invoke(item);
protected internal override object PropertyFunc(T item) => null;
protected internal override void SetProperty(object item, object value)
{
}
protected internal override Type PropertyType => DataType;
}
请记住,这只是一个示例,而不是完整的实现。这显示了如何使过滤器运算符起作用,但如果您想编辑一行,则需要提供您自己的
SetProperty
实现。