Blazor EditForm 失去了对数据绑定的关注

Blazor EditForm loses focus on data binding

我需要在用户单击向上或向下箭头时将新数据加载到我的表单中。期望是任何具有焦点的单元格,在加载新数据后保持焦点。

以下代码可以捕获键盘输入,并使用数据绑定将正确的记录加载到我的表单中。但是我发现,一旦绑定了新数据,表单就会失去焦点。

MyComponent.razor:

<span @onkeypress="@KeyHandler" @onkeydown="@KeyHandler">
    <EditForm Model="@CurrentRecord">
        <DataAnnotationsValidator />
        <ValidationSummary />
        @Content
    </EditForm>
</span>

@code {
[Parameter]
public RenderFragment Content { get; set; }
public List<MyModel> Data { get; set; } = new List<MyModel>();
private int currentIndex;

protected async Task KeyHandler(KeyboardEventArgs e)
{
    if (e.Key == "DownArrow") await LoadNextRecord();
}

async Task LoadNextRecord()
{
    CurrentRecord = Data.ElementAt(++currentIndex);
    // Form loses focus here!!
}
}

现在我可以实现一个简单的 javascript 来在重新绑定数据时聚焦第一个元素。但我的要求是将焦点保持在原处。我找不到一种通用的方法来获取焦点元素然后重新聚焦,而不必为表单中的每个元素分配 Id 或 @ref。

还有其他方法可以解决这个问题吗?

Is there another way to solve this problem?

不,没有...没有通用的方法来做到这一点,现在没有,可能在不久的将来也没有。

目前Blazor最多可以设置一个input的焦点,如下:

<button @onclick="() => textInput.FocusAsync()">Set focus</button>
<input @ref="textInput"/>

请注意,上面的代码片段仅适用于 Asp.Net Core 5.0(预览版)。

我可以提出的唯一解决方案是设计一种方法来发现最后获得焦点的输入元素,然后 re-focus 它来自 OnAfterRender/Async 方法。您必须将 @ref 指令应用于每个输入元素或 id 属性。没有其他方法可以做到这一点。