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

时间:2017-11-07 18:28:08

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

我一直在论坛和互联网上查看关于C#的自定义选择器,我有一个选择器已经正常运行,但我的一些研究告诉我你只能选择1项自定义选择器,这是用于部署选择器的代码。

选取器

<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; 

1 个答案:

答案 0 :(得分:0)

根据您的要求,您可以在本机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();
}

enter image description here

我上传了code sample。请检查。