Средство выбора форм Xamarin SelectedIndexChange пустое исключение - PullRequest
0 голосов
/ 26 января 2019

Я создал приложение, которое запрашивает имя пользователя и возвращает статистику для этого пользователя.Когда счетчик больше 1, он фокусируется на сборщике и просит выбрать один из вариантов.После этого вызывается метод SelectedIndexChanged (Platformselect_SelectedIndexChanged), который получает статистику.Проблема в том, что если пользователь вводит имя пользователя, то в первый раз оно работает.Когда пользователь возвращается и повторно вводит имя пользователя, он не фокусируется (он не показывает средство выбора) и автоматически вызывает метод SelectedIndexChanged с platformselect.SelectedIndex, равным -1, что приводит к сбою моей программы.Не могли бы вы мне помочь?

Я попытался установить фокус на главном потоке, я протестировал его на iOS и Android, и возникает та же проблема.

public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            platformselect.HeightRequest = 0;
            this.search.Clicked += Button_Clicked;
        }



        public async void searchStats(string usernameText)
        {
            search.IsEnabled = false;
            activityIndicator.IsRunning = true;
            var id = await GetDataLogic.GetID(usernameText);
            publicid = id;
            activityIndicator.IsRunning = false;

            if (id.uid == "error")
            {
                await DisplayAlert("Error", "Could not find username: " + usernameText, "OK");
                search.IsEnabled = true;
                return;
            }
            else if (id.uid == "errornointernet")
            {
                await DisplayAlert("Error", "Could not connect to the Internet. Please check your connection and try again.", "OK");
                search.IsEnabled = true;
                return;
            }
            else
            {
                if(id.platforms.Count > 1)
                {
                    platformselect.ItemsSource = publicid.platforms.ToList();
                    //we have to show alert to choose platform and then call get user stats.
                    **Device.BeginInvokeOnMainThread(() =>
                    {
                        if (platformselect.IsFocused)
                            platformselect.Unfocus();
                        platformselect.Focus();
                    });**
                }
                else
                {
                    //we call it without asking because there is only one platform.
                    var userstats = await GetDataLogic.GetStats(id, 0);
                    await Navigation.PushAsync(new Stats(userstats, favorites));
                }

            }

        }
        private async void Platformselect_SelectedIndexChanged(object sender, EventArgs e)
        {
            //the second time it doesnt show the picker and it automatically enters -1... it returns null exception. Has to be investigated.
            var userstats = await GetDataLogic.GetStats(publicid, platformselect.SelectedIndex);
            await Navigation.PushAsync(new Stats(userstats, favorites));
        }
    }

Я хотел быон всегда должен фокусироваться на средстве выбора и ждать ответа пользователя, а не автоматически вызывать SelectedIndexChanged с -1 как selectedindex

1 Ответ

0 голосов
/ 26 января 2019

Я предлагаю изменить ваш обработчик событий таким образом

 private async void Platformselect_SelectedIndexChanged(object sender, EventArgs e)
 {
    //Check for unselection event
    if(platformselect.SelectedIndex == -1) return;


    var userstats = await GetDataLogic.GetStats(publicid, platformselect.SelectedIndex);
    await Navigation.PushAsync(new Stats(userstats, favorites));
 }
...