【问题标题】:xamarin picker control selectedindexchange event raised only when done picking itemxamarin 选择器控件 selectedindexchange 事件仅在完成选择项目时引发
【发布时间】:2018-06-08 14:23:45
【问题描述】:

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

用户滚动浏览选择器控件中的项目,然后用户选择预置在选择器控件中的“完成”按钮。无论如何,当用户按下“完成”而不是索引更改时,是否有捕捉。

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

提前致谢

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

【问题讨论】:

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


    【解决方案1】:

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

    简单

    在拾取器上设置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

    【讨论】:

    • 我已经从 .forms 2.3.x 更新到 3.1 并注意到,事件 SelectedIndexChanged 的​​行为发生了变化(旧:在“完成”之后,每次更改都是新的)。我已将 SelectedIndexChanged- 替换为 Unfocused 事件(如此处所建议)并且它有效。如果您也这样做并访问选择器的 SelectedIndex 属性,则必须在 Android 中处理取消情况(如果 (SelectedIndex = -1) {return} 或类似的)。
    【解决方案2】:

    如 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】:

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

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

      【讨论】:

        【解决方案4】:
        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 将等到“完成”按钮被点击。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-15
          • 2019-06-20
          • 2019-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-27
          • 1970-01-01
          相关资源
          最近更新 更多