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

.NET MAUI Picker在Windows端手动设置ItemsSource后不更新求助

.NET MAUI Picker在Windows平台首次点击无法初始化的问题

我的代码在Android平台运行正常,但Windows平台下Picker首次点击无法加载选项。相关代码如下:

XAML代码

<Picker x:Name="pickerMarca"
        Title="Selecione a marca"
        HorizontalOptions="Center"
        FontSize="20"
        BackgroundColor="Red"                  
        SelectedIndexChanged="SelecionarMarca"
</Picker>

C#代码

private void CarregarMarca(string veiculo)
{
    pickerMarca.ItemsSource = MarcaRepositorio.ListarMarcas(veiculo);
    pickerMarca.ItemDisplayBinding = new Binding("nome");
}

public void SelecionarMarca(object sender, EventArgs e)
{
    var pickerMarca = (Picker)sender;
    int selectedIndex = pickerMarca.SelectedIndex;

    if (selectedIndex != -1)
    {
        Marca marca = (Marca)pickerMarca.ItemsSource[selectedIndex];
        selCodigoMarca = marca.codigo;

        CarregarModelo(selCodigoMarca);
    }
}

我找到一个基于数组的临时解决方案,但无法显示Marca模型的nome属性。想请教:如何在使用该临时方案时显示nome属性?或者如何修改原有代码使其在Windows端正常工作?


解决方案

一、修复原有代码适配Windows平台

Windows平台的Picker存在UI线程更新不及时的问题,可通过以下方式修复:

  1. 强制在UI线程更新数据源
    将设置ItemsSource的操作切换到UI线程执行,避免异步加载导致的UI不同步:

    private void CarregarMarca(string veiculo)
    {
        var marcas = MarcaRepositorio.ListarMarcas(veiculo);
        MainThread.BeginInvokeOnMainThread(() =>
        {
            pickerMarca.ItemsSource = marcas;
            pickerMarca.ItemDisplayBinding = new Binding("nome");
            pickerMarca.SelectedIndex = -1; // 避免自动触发选中事件
        });
    }
    
  2. 改用ObservableCollection作为数据源
    Windows平台对普通List的UI变更感知较弱,将ListarMarcas的返回类型改为ObservableCollection<Marca>:

    public static ObservableCollection<Marca> ListarMarcas(string veiculo)
    {
        // 原有业务逻辑不变,最后返回ObservableCollection
        return new ObservableCollection<Marca>(你的数据源集合);
    }
    
  3. 在XAML中显式绑定ItemDisplayBinding
    直接在XAML中设置绑定,避免代码动态设置的潜在问题:

    <Picker x:Name="pickerMarca"
            Title="Selecione a marca"
            HorizontalOptions="Center"
            FontSize="20"
            BackgroundColor="Red"                  
            SelectedIndexChanged="SelecionarMarca"
            ItemDisplayBinding="{Binding nome}" />
    

二、临时数组方案显示nome属性

如果坚持使用数组方案,可通过两种方式实现:

  1. 提取nome属性生成字符串数组
    将Marca对象的nome属性单独提取为字符串数组作为数据源,后续通过nome匹配原对象:

    private void CarregarMarca(string veiculo)
    {
        var marcas = MarcaRepositorio.ListarMarcas(veiculo);
        pickerMarca.ItemsSource = marcas.Select(m => m.nome).ToArray();
    }
    
    public void SelecionarMarca(object sender, EventArgs e)
    {
        var pickerMarca = (Picker)sender;
        int selectedIndex = pickerMarca.SelectedIndex;
    
        if (selectedIndex != -1)
        {
            string selectedNome = pickerMarca.Items[selectedIndex];
            var marcas = MarcaRepositorio.ListarMarcas(veiculo参数);
            Marca marca = marcas.First(m => m.nome == selectedNome);
            selCodigoMarca = marca.codigo;
    
            CarregarModelo(selCodigoMarca);
        }
    }
    
  2. 重写Marca类的ToString方法
    让Picker默认显示nome属性,只需重写Marca类的ToString方法:

    public class Marca
    {
        public string codigo { get; set; }
        public string nome { get; set; }
    
        public override string ToString()
        {
            return nome;
        }
    }
    

    此时直接设置pickerMarca.ItemsSource = marcas.ToArray();,Picker就会自动显示每个Marca的nome值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:35:23