【问题标题】:multiple selection on custom picker C# UWP自定义选择器 C# UWP 上的多项选择
【发布时间】:2023-03-04 12:26:01
【问题描述】:

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

选择器

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

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

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

【问题讨论】:

    标签: c#-4.0 uwp uwp-xaml picker xamarin.uwp


    【解决方案1】:

    根据您的要求,您可以在本机 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 项目源传递给本机控件(组合框)。当组合框下拉关闭时,您可以执行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。请检查。

    【讨论】:

    • 它真的很有用,我能够解决我的问题!
    • 如果您使用 UWP PickerRenderer ...并且您更改了 CustomPicker 所在的布局,...那么您的 UWP 应用程序将崩溃。在这个 UWP 废话从我脚下拉开地毯之前浪费了五个星期。请注意。
    猜你喜欢
    • 2012-05-18
    • 2021-03-05
    • 2012-01-20
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多