Merhaba,
Önceki yazımda Forms katmanında nasıl Android AutoCompleteTextView kullanacağımızı anlatmıştım. Bu yazımda ise, AutoComplete Input içerisindeki datayı Forms tarafından nasıl göndereceğimizi anlatacağım.
İhtiyacımız çok net! AutoCompleteEntryRenderer sınıfımızdaki ArrayAdapter oluşturma kısmına veriyi Forms katmanında taşımak, ama nasıl? AutoCompleteEntryRenderer sınıfımızdaki Names String Array’i yerine Forms katmanındaki bir datayı BindableProperty yardımıyla taşıyabiliriz.
BindableProperty Xamarin.Forms içerisinde özel bir tiptir. BindableProperty sayesinde istediğimiz bir Xamarin.Forms kontrolüne ihtiyaç duyduğumuz bir özellik ekleyebiliriz.
AutoCompleteEntry sınıfına Data adında bir property eklemeliyiz ve bu property String listesi tipinde olmalı (şimdilik).
namespace AutoCompleteSample.CustomControls { public class AutoCompleteEntry : View { public static readonly BindableProperty DataProperty = BindableProperty.Create (nameof(Data), typeof(IList<String>), typeof(AutoCompleteEntry), null); public IList<String> Data { get { return (IList<String>)GetValue(DataProperty); } set { SetValue(DataProperty, value); } } } }
Renderer sınıfımızda override ettiğimiz OnElementChanged methodu içerisinde bu özel propertyi kullanmamız gerekiyor. Çünkü Adapter işlemlerini bu method içerisinde yapıyoruz.
protected override void OnElementChanged(ElementChangedEventArgs<AutoCompleteEntry> e) { base.OnElementChanged(e); if (e.OldElement != null || this.Element == null) return; var data = (IList<String>)this.Element.Data; var autoComplete = new AutoCompleteTextView(_context); var adapter = new ArrayAdapter<String>(_context, Resource.Layout.ListItem, data); autoComplete.Adapter = adapter; SetNativeControl(autoComplete); }
Element : Renderer sınıflarınızda Element propertysini kullanarak Forms katmanınızdaki render etmek istediğiniz kontrole erişirsiniz.
Artık Names değişkenine ihtiyacımız kalmadı 🙂 Forms katmanından zahmetsiz bir şekilde String Listesi tipinde veri taşıyabiliyoruz.
public MainPage() { InitializeComponent(); this.BindingContext = new List<String> { "Yiğit", "Xamarin", "AI", "ML", "Cognitive Services", "Microsoft" }; } <StackLayout> <controls:AutoCompleteEntry Data="{Binding .}" /> </StackLayout>
Yorum Gönder