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

MAUI中ListView点击时如何正确传递绑定的ID参数至目标页面?

正确的MAUI ListView点击参数传递方式

你遇到的空引用异常,核心原因是ItemTemplate中的控件属于模板实例,ListView的FindByName方法无法直接访问模板内部的元素,所以LtIdCliente会返回null,进而触发异常。

正确的做法是直接从点击事件的参数中获取绑定的数据源对象,不需要通过UI控件中转:

步骤1:确保数据源是强类型实体

首先需要定义对应Cliente数据的实体类(如果还未定义):

public class Cliente
{
    public string Marca { get; set; }
    public string ID { get; set; } // 类型可根据API返回的实际数据调整为int等
}

你的ListView的ItemsSource应该是List<Cliente>类型的集合,确保数据绑定正确。

步骤2:修改点击事件代码

直接从ItemTappedEventArgs.Item获取点击项对应的实体对象,提取ID参数:

public void TapCliente(object sender, ItemTappedEventArgs e)
{
    // 转换为绑定的实体类型
    var cliente = e.Item as Cliente;
    if (cliente == null) return;

    // 直接获取实体的ID属性
    string clienteId = cliente.ID;

    Navigation.PushModalAsync(new Facturas(clienteId));
}

步骤3:优化Facturas页面的加载逻辑(可选但推荐)

将async void类型的CargarData改为async Task,避免异步调用的潜在问题;同时结合页面生命周期方法加载数据,更符合MAUI的设计规范:

public partial class Facturas : ContentPage
{
    private string _idCliente;

    public Facturas(string idCliente)
    {
        InitializeComponent();
        _idCliente = idCliente;
    }

    protected override async void OnAppearing()
    {
        base.OnAppearing();
        
        if (Connectivity.Current.NetworkAccess == NetworkAccess.None)
        {
            lblInternet.Text = "Tu conexión a internet es deficiente o nula, no podemos realizar consultas.";
        }
        else
        {
            lblInternet.Text = "Conexión estable con el servidor de Haif.";
            await CargarData(_idCliente);
        }
    }

    public async Task CargarData(string idCliente)
    {
        var contenido = "";
        
        // 使用using自动释放HttpClient资源
        using (HttpClient cliente = new HttpClient())
        {
            var restUrl = $"https://*************/api/FacturaCliente?id={idCliente}";
            cliente.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
            
            HttpResponseMessage respuesta = await cliente.GetAsync(restUrl);
            respuesta.EnsureSuccessStatusCode(); // 确保请求成功,否则抛出异常
            
            contenido = await respuesta.Content.ReadAsStringAsync();
            var items = JsonConvert.DeserializeObject<List<Factura>>(contenido);
            Facturas_List.ItemsSource = items;
        }
    }

    #region Clase Facturas
    public class Factura
    {
        public int ID { get; set; }
        public string NumeroFactura { get; set; }
        public string Total { get; set; }
    }
    #endregion
}

额外优化:采用MVVM模式的Command绑定

如果后续想优化架构,可使用ListView的ItemSelectedCommand替代事件绑定,减少代码隐藏的耦合:

<ListView x:Name="Clientes_List" 
          RowHeight="60"
          HeightRequest="600"
          ItemSelectedCommand="{Binding SeleccionarClienteCommand}"
          ItemSelectedCommandParameter="{Binding .}">
    <!-- ItemTemplate保持原有结构不变 -->
</ListView>

在ViewModel中定义命令:

public ICommand SeleccionarClienteCommand => new Command<Cliente>(async (cliente) =>
{
    if (cliente != null)
        await Navigation.PushModalAsync(new Facturas(cliente.ID));
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:10:47