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

时间:2017-12-28 01:48:24

标签: c# xamarin xamarin.forms xamarin.ios picker

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

用户滚动选择器控件中的项目,然后用户选择"完成"预先构建到选择器控件中的按钮。无论如何,当用户按下" Done"而不是在索引发生变化时。

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

提前致谢

<Picker x:Name="PickerMinStars" Title="Min number of 5 stars"  SelectedIndexChanged="Handle_PickerStarsSelectedIndexChanged">
        </Picker>

4 个答案:

答案 0 :(得分:8)

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

简单

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

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

picker.On<iOS>().SetUpdateMode(UpdateMode.WhenFinished);

复合

创建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!!!!");
    }
}

参阅

How can we handle the done button click event for a Xamarin Forms Picker?

Picker Selection Event

答案 1 :(得分:1)

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

<Picker SelectedItem="{Binding SelectedItemProperty}" />

答案 2 :(得分:1)

如Pieter Nijs在他的blog中所建议的那样,要处理来自XAML代码的选择更改事件。

<Picker ItemsSource="{Binding FooList}"
    SelectedItem="{Binding SelectedFoo}"
    ItemDisplayBinding="{Binding Name}"
    iOSSpecific:Picker.UpdateMode="WhenFinished" />

这需要添加参考

xmlns:iOSSpecific="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"

点击确定后哪个会引发所选索引更改事件。

答案 3 :(得分:0)

public BindablePicker() 
{
    if (Device.OS == TargetPlatform.iOS) 
    {
        this.Unfocused += OnUnfocused; 
    }
    else
    {
        this.SelectedIndexChanged += OnSelectedIndexChanged; 
    } 
} 

private void OnUnfocused(object sender, FocusEventArgs e) 
{ 
    OnSelectedIndexChanged(sender, e);
} 

这样,Android将使用&#34;标准&#34;处理索引更改的方法和iOS将一直等到&#34; Done&#34; - 按钮被点击。