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

.NET Maui 7.0 下拉式多选选择器实现方案咨询

.NET MAUI 7.0 实现下拉式多选Picker的解决方案

针对你的需求(下拉触发、多选、兼容MAUI 7.0),可以参考以下几个可行方案:

方案一:自定义Popup封装多选选择器

利用MAUI 7.0原生支持的Popup控件,将带多选功能的CollectionView嵌入其中,通过按钮触发弹出,模拟下拉多选Picker的效果。

步骤1:创建多选Popup

新建一个MultiSelectPopup.xaml,内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<Popup xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       x:Class="YourNamespace.MultiSelectPopup"
       Size="300,400">
    <VerticalStackLayout>
        <CollectionView x:Name="SelectionCollectionView"
                        SelectionMode="Multiple"
                        ItemsSource="{Binding Items}"
                        SelectedItems="{Binding SelectedItems}">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <HorizontalStackLayout Padding="10">
                        <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}"
                                  Margin="0,0,10,0"/>
                        <Label Text="{Binding DisplayText}"
                               VerticalOptions="Center"/>
                    </HorizontalStackLayout>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
        <HorizontalStackLayout HorizontalOptions="End" Padding="10">
            <Button Text="取消" Clicked="Cancel_Clicked"/>
            <Button Text="确认" Clicked="Confirm_Clicked" Margin="10,0,0,0"/>
        </HorizontalStackLayout>
    </VerticalStackLayout>
</Popup>

对应的后台代码MultiSelectPopup.xaml.cs:

using Microsoft.Maui.Controls;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace YourNamespace;

public partial class MultiSelectPopup : Popup
{
    public ObservableCollection<SelectableItem> Items { get; set; }
    public ObservableCollection<SelectableItem> SelectedItems { get; set; }
    public event EventHandler<ObservableCollection<SelectableItem>> SelectionConfirmed;

    public MultiSelectPopup(IEnumerable<string> itemList, IEnumerable<string> preselectedItems)
    {
        InitializeComponent();
        Items = new ObservableCollection<SelectableItem>(
            itemList.Select(item => new SelectableItem
            {
                DisplayText = item,
                IsSelected = preselectedItems.Contains(item)
            })
        );
        SelectedItems = new ObservableCollection<SelectableItem>(
            Items.Where(i => i.IsSelected)
        );
        BindingContext = this;
    }

    private void Confirm_Clicked(object sender, EventArgs e)
    {
        SelectionConfirmed?.Invoke(this, SelectedItems);
        Close();
    }

    private void Cancel_Clicked(object sender, EventArgs e)
    {
        Close();
    }
}

// 辅助模型类
public class SelectableItem : INotifyPropertyChanged
{
    private bool _isSelected;
    public string DisplayText { get; set; }

    public bool IsSelected
    {
        get => _isSelected;
        set
        {
            _isSelected = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

步骤2:在主页面使用Popup

修改主页面的XAML,用按钮替代原来的CollectionView:

<Button Text="选择依赖任务" Clicked="OpenMultiSelectPopup_Clicked"/>
<Label Text="{Binding SelectedTasksSummary}" Margin="10,0"/>

主页面后台代码:

private async void OpenMultiSelectPopup_Clicked(object sender, EventArgs e)
{
    var viewModel = (YourViewModel)BindingContext;
    var popup = new MultiSelectPopup(
        viewModel.DependentTasks,
        viewModel.SelectedDependentTasks
    );
    
    popup.SelectionConfirmed += (s, selectedItems) =>
    {
        viewModel.SelectedDependentTasks.Clear();
        foreach (var item in selectedItems)
        {
            viewModel.SelectedDependentTasks.Add(item.DisplayText);
        }
        viewModel.UpdateSelectedTasksSummary();
    };

    await Shell.Current.ShowPopupAsync(popup);
}

ViewModel中补充对应的属性和方法:

public ObservableCollection<string> DependentTasks { get; set; } = new();
public ObservableCollection<string> SelectedDependentTasks { get; set; } = new();
public string SelectedTasksSummary { get; set; } = "未选择任务";

public void UpdateSelectedTasksSummary()
{
    SelectedTasksSummary = SelectedDependentTasks.Count > 0 
        ? $"已选:{string.Join(", ", SelectedDependentTasks)}" 
        : "未选择任务";
    OnPropertyChanged(nameof(SelectedTasksSummary));
}

方案二:使用兼容MAUI 7.0的第三方控件

可以选择支持MAUI 7.0的第三方输入控件,比如Syncfusion.Maui.Inputs中的MultiSelectComboBox,它原生支持下拉多选功能,无需自己封装。你可以通过NuGet搜索安装对应兼容MAUI 7.0的版本,使用方式类似原生Picker,只需绑定数据源和选中项即可。

方案三:自定义可复用下拉多选控件

如果需要在多个页面复用,可以将按钮和Popup的逻辑封装成一个ContentView,对外暴露ItemsSource、SelectedItems等绑定属性,进一步简化使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:02:45