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

.NET MAUI列表项内嵌Picker选择选项后自动重复弹出对话框问题

.NET MAUI 列表项内Picker重复弹出对话框的解决方案

问题原因

当Picker嵌入ListView/CollectionView的ItemTemplate中时,选中选项后对话框自动重新弹出,通常是以下原因导致:

  • 选中选项后绑定属性更新,触发列表项UI重绘,Picker被重置或再次获得焦点
  • 列表项的点击事件与Picker的交互事件发生冒泡冲突,选完选项后列表项点击事件触发Picker重新打开

解决方法

1. 禁用列表项点击交互,仅保留Picker可操作

给列表项的根布局设置IsEnabled="False",同时单独开启Picker的IsEnabled="True",避免列表项点击事件干扰Picker:

<ListView ItemsSource="{Binding YourItemList}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <!-- 根布局禁用交互 -->
                <Grid IsEnabled="False">
                    <Picker Title="Select an option" 
                            IsEnabled="True"
                            SelectedItem="{Binding SelectedOption}">
                        <Picker.Items>
                            <x:String>Option 1</x:String>
                            <x:String>Option 2</x:String>
                            <x:String>Option 3</x:String>
                        </Picker.Items>
                    </Picker>
                </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

2. 使用Behavior控制Picker打开状态

自定义Behavior拦截重复的Focus事件,防止Picker反复弹出:

using Microsoft.Maui.Controls;

namespace YourNamespace
{
    public class PickerPreventReopenBehavior : Behavior<Picker>
    {
        private bool _isPickerOpen;

        protected override void OnAttachedTo(Picker picker)
        {
            base.OnAttachedTo(picker);
            picker.Focused += OnPickerFocused;
            picker.Unfocused += OnPickerUnfocused;
        }

        protected override void OnDetachingFrom(Picker picker)
        {
            base.OnDetachingFrom(picker);
            picker.Focused -= OnPickerFocused;
            picker.Unfocused -= OnPickerUnfocused;
        }

        private void OnPickerFocused(object sender, FocusEventArgs e)
        {
            if (_isPickerOpen)
            {
                e.Handled = true;
                return;
            }
            _isPickerOpen = true;
        }

        private void OnPickerUnfocused(object sender, FocusEventArgs e)
        {
            _isPickerOpen = false;
        }
    }
}

在XAML中引用该Behavior:

<Picker Title="Select an option">
    <Picker.Items>
        <x:String>Option 1</x:String>
        <x:String>Option 2</x:String>
        <x:String>Option 3</x:String>
    </Picker.Items>
    <Picker.Behaviors>
        <local:PickerPreventReopenBehavior />
    </Picker.Behaviors>
</Picker>

3. 关闭CollectionView的选中功能

如果使用CollectionView,设置SelectionMode="None",避免列表项选中触发UI重绘:

<CollectionView ItemsSource="{Binding YourItemList}" SelectionMode="None">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Picker Title="Select an option">
                <Picker.Items>
                    <x:String>Option 1</x:String>
                    <x:String>Option 2</x:String>
                    <x:String>Option 3</x:String>
                </Picker.Items>
            </Picker>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:35:24