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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:20:22