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)
有三种解决方法可以满足您的要求.
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)
参考
正如 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)