Xamarin选择器控件的SelectedIndexChanged事件只在完成选定项目后触发。

9

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

用户通过滚动Picker控件中的选项,然后选择预构建在Picker控件中的"Done"按钮。有没有办法捕获用户按下"Done"按钮而不是索引更改的事件。

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

提前感谢。

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

14

有三种方法可以实现您的要求。

简单

在选择器上设置unfoucus事件,在选择器将要关闭时触发(点击Done按钮或选择器外部区域)。

中等

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

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

复杂

创建自定义渲染器来处理“完成”按钮的点击事件。

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

参考:

如何处理Xamarin Forms Picker中“完成”按钮的点击事件?

Picker选择事件


我已从.forms 2.3.x 更新到了3.1并注意到SelectedIndexChanged事件的行为发生了变化(旧版本:在“完成”之后触发,新版本:每次更改都会触发)。我已将SelectedIndexChanged事件替换为Unfocused事件(如此处建议的),并且它可以正常工作。如果您也这样做,并访问选择器的SelectedIndex属性,则必须在Android中处理取消情况(if (SelectedIndex = -1) {return}或类似情况)。 - FredyWenger

5

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

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

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


1
您可以将SelectedItem绑定到ViewModel中的属性。只有在数据更改时,该属性才会更新。
<Picker SelectedItem="{Binding SelectedItemProperty}" />

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将使用“标准”方式处理索引更改,而iOS将等待用户点击“完成”按钮。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接