You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI Blazor安卓端可搜索下拉框选中值无法填入输入框

解决方案:.NET MAUI Blazor Android 可搜索下拉框选中值无法回填问题

你的问题根源是Android WebView对原生<datalist>组件的支持存在兼容性缺陷,在Android 10/11版本中偶发选中值无法同步到输入框的情况,而Windows平台的WebView实现无此问题。以下是几种可行的解决方法:

方法一:替换原生datalist为自定义可搜索下拉组件

原生datalist在MAUI Blazor的Android WebView中表现不稳定,自行实现轻量可搜索下拉组件可彻底解决问题:

1. 创建自定义组件 SearchableDropdown.razor

<div class="searchable-dropdown">
    <input type="text" 
           @bind="@SearchText" 
           @bind:event="oninput" 
           class="form-control" 
           placeholder="搜索..." 
           disabled="@Disabled" />
    @if (!string.IsNullOrEmpty(SearchText) && FilteredItems.Any())
    {
        <ul class="dropdown-list">
            @foreach (var item in FilteredItems)
            {
                <li @onclick="() => SelectItem(item)">@item.Text</li>
            }
        </ul>
    }
</div>

@code {
    [Parameter] public List<DropdownItem> Items { get; set; } = new();
    [Parameter] public EventCallback<DropdownItem> OnItemSelected { get; set; }
    [Parameter] public bool Disabled { get; set; }

    private string SearchText { get; set; } = string.Empty;
    private IEnumerable<DropdownItem> FilteredItems => Items.Where(i => 
        i.Text.Contains(SearchText, StringComparison.OrdinalIgnoreCase) || 
        i.Value.Contains(SearchText, StringComparison.OrdinalIgnoreCase));

    private async Task SelectItem(DropdownItem item)
    {
        SearchText = item.Value;
        await OnItemSelected.InvokeAsync(item);
    }

    public class DropdownItem
    {
        public string Value { get; set; } = string.Empty;
        public string Text { get; set; } = string.Empty;
    }
}

2. 添加组件样式(在wwwroot/css/site.css中)

.searchable-dropdown {
    position: relative;
    width: 100%;
}

.dropdown-list {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    border: 1px solid #dee2e6;
    border-top: none;
    background-color: #fff;
    list-style: none;
    padding: 0;
    margin: 0;
    max-height: 220px;
    overflow-y: auto;
    z-index: 1000;
}

.dropdown-list li {
    padding: 0.5rem 0.75rem;
    cursor: pointer;
}

.dropdown-list li:hover {
    background-color: #f8f9fa;
}

3. 在页面中使用组件

<div class="panel panel-default">
    <div class="panel-body ">
        <div class="container-fluid">
            <table class="table dt-responsive" id="header">
                <tr>
                    <th>From Code</th>
                    <td>
                        <SearchableDropdown 
                            Items="@locationItems" 
                            OnItemSelected="@(item => transferOrderHeader.Transfer_from_Code = item.Value)"
                            Disabled="@isDisabled" />
                    </td>
                    <th>To Code</th>
                    <td>
                        <SearchableDropdown 
                            Items="@locationItems" 
                            OnItemSelected="@(item => transferOrderHeader.Transfer_to_Code = item.Value)"
                            Disabled="@isDisabled" />
                    </td>
                </tr>
            </table>
        </div>
    </div>
</div>

@code {
    private List<SearchableDropdown.DropdownItem> locationItems;

    protected override void OnInitialized()
    {
        // 转换现有数据为组件所需格式
        locationItems = datamodel.locations.Select(loc => new SearchableDropdown.DropdownItem
        {
            Value = loc.Code,
            Text = loc.Address.Name
        }).ToList();
    }
}

方法二:修复原生datalist的事件同步问题

若不想替换组件,可通过强制事件同步和组件刷新缓解问题:

修改输入框代码,绑定input事件并手动同步值:

<input type="search" 
       list="loclist" 
       @bind="@transferOrderHeader.Transfer_from_Code" 
       @bind:event="oninput" 
       @onchange="UpdateFrom" 
       disabled=@isDisabled />

<input type="search" 
       list="loclist" 
       @bind="@transferOrderHeader.Transfer_to_Code" 
       @bind:event="oninput" 
       @onchange="UpdateTo" 
       disabled=@isDisabled />

在代码中强制触发组件刷新:

private void UpdateFrom(ChangeEventArgs e)
{
    transferOrderHeader.Transfer_from_Code = e.Value?.ToString() ?? string.Empty;
    StateHasChanged(); // 强制组件重新渲染,确保值同步
}

private void UpdateTo(ChangeEventArgs e)
{
    transferOrderHeader.Transfer_to_Code = e.Value?.ToString() ?? string.Empty;
    StateHasChanged();
}

方法三:升级开发环境

你当前使用的Visual Studio 2022 17.4.4和.NET 6版本较旧,MAUI在后续的.NET 7/.NET 8版本中修复了大量WebView相关兼容性问题。建议升级到:

  • .NET 8(长期支持版本)
  • Visual Studio 2022 17.8或更高版本

升级后很多Android WebView的原生控件问题会被自动修复。

内容的提问来源于stack exchange,提问作者RollinB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:48:28