我正在使用Xamarin.Forms.Picker控件并处理SelectedIndexChanged事件。
用户滚动选择器控件中的项目,然后用户选择"完成"预先构建到选择器控件中的按钮。无论如何,当用户按下" Done"而不是在索引发生变化时。
当用户滚动项目时,索引可以多次更改,我不想处理不必要的事件,因为我只关心最后选择的项目。
提前致谢
<Picker x:Name="PickerMinStars" Title="Min number of 5 stars" SelectedIndexChanged="Handle_PickerStarsSelectedIndexChanged">
</Picker>
答案 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?
答案 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; - 按钮被点击。