Android MAUI .NET Picker异常:选择后弹窗反复出现
MAUI Android ListView内Picker弹窗反复弹出问题解决
问题核心原因
你遇到的Picker异常,根源在于两个错误用法:
- DataTemplate中给Picker设置
x:Name="{Binding ArticleNumber}"是违规操作,动态绑定Name会导致每个列表项的Picker产生命名冲突,Android视图系统无法正确管理控件状态,直接触发弹窗重复弹出。 - 依赖
SelectedIndexChanged事件处理选择逻辑,容易间接引发ListView的项重绘,进一步加剧弹窗异常。
修复方案
1. 移除动态Name绑定
直接删除Picker的x:Name="{Binding ArticleNumber}",DataTemplate内的控件不需要通过Name标识,改用数据绑定关联业务逻辑。
2. 改用MVVM绑定选中值
在数据模型中新增属性绑定到Picker的SelectedItem,替代事件驱动的方式,避免列表项重绘触发弹窗异常。
3. 清理冗余布局设置
去掉ViewCell的Height="100",因为ListView已经设置了RowHeight="100",重复设置会干扰布局计算。
修改后的代码示例
数据模型(需实现INotifyPropertyChanged)
public class ArticleModel : INotifyPropertyChanged { public string ArticleNumber { get; set; } public string Description { get; set; } public string ImageSource { get; set; } private string _selectedQuantity; public string SelectedQuantity { get => _selectedQuantity; set { _selectedQuantity = value; OnPropertyChanged(); // 这里可以添加选中值变化后的业务逻辑,替代原事件处理 } } public event PropertyChangedEventHandler PropertyChanged; void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
修改后的XAML代码
<ListView x:Name="listView" RowHeight="100"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Image Grid.Column="0" Source="{Binding ImageSource}" WidthRequest="80" /> <Label Grid.Column="1" Text="{Binding ArticleNumber}" /> <Label Grid.Column="2" Text="{Binding Description}" /> <Picker Grid.Column="3" BackgroundColor="LightGray" FontSize="16" HorizontalTextAlignment="Center" TitleColor="Black" VerticalTextAlignment="Center" Title="Velg antall" TextColor="Black" SelectedItem="{Binding SelectedQuantity, Mode=TwoWay}"> <Picker.Items> <x:String>1</x:String> <x:String>2</x:String> <x:String>3</x:String> <x:String>4</x:String> <x:String>5</x:String> </Picker.Items> </Picker> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView>
修复逻辑说明
- 移除动态Name绑定后,Android系统能正确区分每个列表项的Picker,避免弹窗状态管理混乱。
- 双向绑定
SelectedItem遵循MAUI的MVVM设计模式,彻底避免事件触发导致的列表项重绘,从根源解决弹窗反复弹出问题。 - 清理冗余布局设置,让ListView的布局计算更准确,减少潜在的视图异常。
内容的提问来源于stack exchange,提问作者MangelSen74
相关产品推荐
相关产品推荐

