xamarin选取器控制selectedindexchange事件仅在完成拾取项目时引发

Jas*_*ith 4 c# picker xamarin.ios xamarin xamarin.forms

我正在使用Xamarin.Forms.Picker控件并处理SelectedIndexChanged事件.

用户通过选择器控件中的项目滚动,然后用户选择预先构建到选取器控件中的"完成"按钮.无论如何,当用户按下"完成"而不是在索引改变时捕获.

当用户滚动项目时,索引可以多次更改,我不想处理不必要的事件,因为我只关心最后选择的项目.

提前致谢

<Picker x:Name="PickerMinStars" Title="Min number of 5 stars"  SelectedIndexChanged="Handle_PickerStarsSelectedIndexChanged">
        </Picker>
Run Code Online (Sandbox Code Playgroud)

Col*_*SFT 8

有三种解决方法可以满足您的要求.

简单

unfoucus在Picker上设置事件,它会在选择器被解雇时触发(单击"完成"按钮或选择器的外部区域).

介质

延迟SelectedIndexChanged事件触发,直到您点击完成按钮.

picker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);
Run Code Online (Sandbox Code Playgroud)

复杂

创建Custom Renderers以处理完成按钮单击事件.

public class MyPickerRenderer : PickerRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
    {
        base.OnElementChanged(e);

        if(e.OldElement != null)
        {
            var toolbar = (UIToolbar)Control.InputAccessoryView;
            var doneBtn = toolbar.Items[1];

            doneBtn.Clicked -= DoneBtn_Clicked;
        }

        if(e.NewElement != null)
        {
            var toolbar = (UIToolbar)Control.InputAccessoryView;
            var doneBtn = toolbar.Items[1];

            doneBtn.Clicked += DoneBtn_Clicked;
        }
    }

    void DoneBtn_Clicked(object sender, EventArgs e)
    {
        Console.WriteLine("Clicked!!!!");
    }
}
Run Code Online (Sandbox Code Playgroud)

参考

我们如何处理Xamarin表单选择器的完成按钮单击事件?

选择器选择事件


Muk*_*iya 5

正如 Pieter Nijs 在他的博客中建议的那样,处理 XAML 代码中的选择更改事件

<Picker ItemsSource="{Binding FooList}"
    SelectedItem="{Binding SelectedFoo}"
    ItemDisplayBinding="{Binding Name}"
    iOSSpecific:Picker.UpdateMode="WhenFinished" />
Run Code Online (Sandbox Code Playgroud)

这需要添加引用

xmlns:iOSSpecific="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
Run Code Online (Sandbox Code Playgroud)

点击“确定”后,这将引发选定的索引更改事件。


小智 1

您可以将 绑定SelectedItem到 ViewModel 中的属性。仅当数据更改时该属性才会更新。

<Picker SelectedItem="{Binding SelectedItemProperty}" />
Run Code Online (Sandbox Code Playgroud)