微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除输入文本的所有内容,在 Blazor 中不使用 @bind

如何解决删除输入文本的所有内容,在 Blazor 中不使用 @bind

我想知道是否可以删除用户在输入文本控件中输入的所有内容,在 Blazor 中使用 C#,但不绑定控件。

我有几个文本输入但没有@bind,所以我不能删除与@bind 关联的变量

是否可以通过控件做一个“for”之类的,并询问它是否是输入文本类型以删除内容

谢谢!

解决方法

因此,在您使用扩展程序的这种情况下,最好查看扩展程序的实现方式并从中找出解决方案。如果您examine the source code,您将看到您要清除的过滤器的文本框绑定到column.Filter.SearchValue

<TextEdit Text="@column.Filter.SearchValue" TextChanged="@(async (newValue) => await OnFilterChanged(column,newValue))" />

从那里开始,只需能够在 C# 中清除该属性。不幸的是,Blazorise 不支持对其 DisplayableColumns 属性的公开访问——您需要它来操作 SearchValue。一种 hacky 解决方法是将 DataGrid 子类化,因为属性是 protected

public class MyDataGrid<TItem> : DataGrid<TItem>
{
    public IEnumerable<DataGridColumn<TItem>> MyColumns => DisplayableColumns;
}

有了这个,实现一个“清除过滤器”按钮来清除所有过滤器就很简单了。

<input type="button" value="Clear Filters" @onclick="ClearFilters" />

实现方式:

private void ClearFilters() 
{
    foreach (var column in dataGrid.MyColumns)
    {
        column.Filter.SearchValue = null;
    }
}

您还需要在字段中捕获 DataGrid:

private MyDataGrid<Person> dataGrid;

要设置该字段,您需要将 @ref="dataGrid" 添加到网格中。

现在,综上所述,很明显必须创建子类是次优的。我冒昧地在 opening an issue 中使用了 their GitHub repo 并将此答案作为解决方法引用。

没有子类的完整示例是:

<MyDataGrid TItem="Person" Data="@persons" Filterable="true" @ref="dataGrid">
    <DataGridColumn TItem="Person" Field="@nameof(Person.Name)" />
</MyDataGrid>

<input type="button" value="Clear Filters" @onclick="ClearFilters" />

@code {
    private MyDataGrid<Person> dataGrid;

    private void ClearFilters() 
    {
        foreach (var column in dataGrid.MyColumns)
        {
            column.Filter.SearchValue = null;
        }
    }

    private Person[] persons = new[]
    {
        new Person { Name = "John Doe" },new Person { Name = "Jane Down" }
    };

    public class Person 
    {
        public string Name { get; set; }
    }
}

请注意,由于 Blazor 中的明显限制,您需要在单独的文件中声明 MyDataGrid,而不是作为 @code 块中定义的类。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。