MudDataGrid 可过滤的行和列菜单不起作用

问题描述 投票:0回答:1

我正在使用 mudDataGrid 来显示我的数据(IEnumerable),它工作正常。 我还启用了可过滤功能来过滤列,但是过滤行和列菜单都不起作用! 过滤器行被禁用(只读),并且在列菜单中,运算符列表为空并且没有值字段! (参见我的附图)。

mudDataGrid filterable not working

这是我的代码:

<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>

问题出在哪里,如何解决? 预先感谢

asp.net-core blazor mudblazor
1个回答
0
投票

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
实现。

© www.soinside.com 2019 - 2024. All rights reserved.