自定义选择器 C# UWP 上的多项选择

multiple selection on custom picker C# UWP

我一直在论坛和互联网上寻找有关 C# 上的自定义选择器的信息,我有一个已经可以使用的选择器,但我的一些研究告诉我你只能 select 的 1 个项目自定义选择器,这是我用来部署选择器的代码。

选择器

<custom:CustomPicker x:Name="pickerCategories" ItemsSource="{Binding listCategoriesName}" SelectedIndex="{Binding SelectedCategory}" SelectedIndexChanged="pickerCategories_SelectedIndexChanged" Grid.Column="1" BackgroundColor="White"/>

项目源作为数据库中的对象列表提供给选择器 有没有办法能够 select 自定义选择器的多个索引? 例如...

Picker pk = new Picker(); pk.SelectionMode=Multiple; 

根据您的要求,您可以在原生 uwp 项目中制作自定义 Picker 渲染器。然后创建一个新的 DataTemplate 用于在本机控件中显示包含复选框的 ComboBox 项。

<DataTemplate x:Key="templateEmployee" >
    <StackPanel  Orientation="Horizontal">
        <CheckBox Content="{Binding Content,Mode=TwoWay}" IsChecked="{Binding IsCheck,Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </StackPanel>
</DataTemplate>

对于 CustomPickerRenderer,您应该将表单 Picker 项目源传递给本机控件 (ComboBox)。当组合框下拉关闭时,您可以执行 InvokeAction 方法将 Data 发送到表单 Picker.

public class CustomPickerRenderer : PickerRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
    {
        base.OnElementChanged(e);
        Control.ItemsSource = e.NewElement.ItemsSource;
        Control.ItemTemplate = (Windows.UI.Xaml.DataTemplate)App.Current.Resources["templateEmployee"];
        Control.DropDownClosed += Control_DropDownClosed;

    }

    private void Control_DropDownClosed(object sender, object e)
    {
        var NewElement = Element as CustomPicker;
        var items = (sender as ComboBox).ItemsSource;
        NewElement.InvokeAction(items);
    }

}

用法

public MainPage()
{
    InitializeComponent();
    MyPicker.ItemsSource = new MainViewModel().itemSource;
    MyPicker.RegisterAction(IsCheckItems);
}
private List<Item> SelecItms = new List<Item>();
private void IsCheckItems(object data)
{
    var items = data as ObservableCollection<Item>;
    var str = new StringBuilder();
    foreach (var item in items)
    {
        if (item.IsCheck)
        {
            SelecItms.Add(item);
            str.AppendLine(item.Content);
        }
    }
    SeleitemLabel.Text = str.ToString();
}

而且我已经上传了 code sample。请检查。