.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线程更新不及时的问题,可通过以下方式修复:
强制在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; // 避免自动触发选中事件 }); }改用ObservableCollection作为数据源
Windows平台对普通List的UI变更感知较弱,将ListarMarcas的返回类型改为ObservableCollection<Marca>:public static ObservableCollection<Marca> ListarMarcas(string veiculo) { // 原有业务逻辑不变,最后返回ObservableCollection return new ObservableCollection<Marca>(你的数据源集合); }在XAML中显式绑定ItemDisplayBinding
直接在XAML中设置绑定,避免代码动态设置的潜在问题:<Picker x:Name="pickerMarca" Title="Selecione a marca" HorizontalOptions="Center" FontSize="20" BackgroundColor="Red" SelectedIndexChanged="SelecionarMarca" ItemDisplayBinding="{Binding nome}" />
二、临时数组方案显示nome属性
如果坚持使用数组方案,可通过两种方式实现:
提取
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); } }重写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
相关产品推荐
相关产品推荐

