Как динамически изменить значения раскрывающегося списка, выбрав другой раскрывающийся список в формах Xamarin - PullRequest
0 голосов
/ 02 апреля 2020

прости наименование. Я пытаюсь динамически загрузить выпадающий список в формах xamarin (цель состоит в том, чтобы создать форму регистрации, в которой у пользователя есть несколько вопросов, и я не хочу повторять вопрос)

    private void InitalizeDropdown2And3()
    {
        dropdown1.ItemsSource.Clear();
        Items3.Clear();
        for (int i = 0; i < 4; i++)
        {
            Items3.Add(i.ToString());
        }
    }
    private void OnDropdownSelected(object sender, ItemSelectedEventArgs e)
    {
        InitalizeDropdown2And3();

        if(!string.IsNullOrEmpty(e.SelectedIndex.ToString()))
        {
            Items3.Remove(e.SelectedIndex.ToString());
        }          

        dropdown1.ItemsSource.Clear();
        dropdown1.ItemsSource = Items3;
        dropdown1.SelectedIndex = 1;            
    }

Я не являюсь конечно, но это не работает.

Код и экран Xamrian enter image description here

      <StackLayout HorizontalOptions="FillAndExpand"
             VerticalOptions="Center"
             Spacing="10"
             Margin="20">
    <local:Dropdown HorizontalOptions="FillAndExpand"
                    VerticalOptions="Center"
                    BackgroundColor="LawnGreen"
                    x:Name="dropdown"/>
    <local:Dropdown HorizontalOptions="FillAndExpand"
                    VerticalOptions="Center"
                    BackgroundColor="MediumSlateBlue"
                    x:Name="dropdown1"/>
    <local:Dropdown HorizontalOptions="FillAndExpand"
                    VerticalOptions="Center"
                    BackgroundColor="MediumOrchid"
                    x:Name="dropdown2"/>
    <StackLayout HorizontalOptions="FillAndExpand"
                 VerticalOptions="Center"
                 Padding="10"
                 BackgroundColor="LightGreen">
        <Label HorizontalOptions="Center"
               VerticalOptions="Center"
               x:Name="label"/>
 </StackLayout>

1 Ответ

0 голосов
/ 03 апреля 2020

Чтобы объяснить это, я сгенерировал некоторые проверенные данные, чтобы показать, как реализовать это, код Xaml следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="FormsPickerSample.MainPage">

    <StackLayout HorizontalOptions="FillAndExpand"
                 VerticalOptions="Center"
                 Spacing="10"
                 Margin="20">
        <Picker HorizontalOptions="FillAndExpand"
                VerticalOptions="Center"
                BackgroundColor="LawnGreen"
                ItemDisplayBinding="{Binding Name}"
                SelectedIndexChanged="dropdown_SelectedIndexChanged"
                x:Name="dropdown" />
        <Picker HorizontalOptions="FillAndExpand"
                VerticalOptions="Center"
                BackgroundColor="MediumSlateBlue"
                SelectedIndexChanged="dropdown1_SelectedIndexChanged"
                ItemDisplayBinding="{Binding Name}"
                x:Name="dropdown1" />
        <Picker HorizontalOptions="FillAndExpand"
                VerticalOptions="Center"
                BackgroundColor="MediumOrchid"
                ItemDisplayBinding="{Binding CityName}"
                SelectedIndexChanged="dropdown2_SelectedIndexChanged"
                x:Name="dropdown2" />
        <StackLayout HorizontalOptions="FillAndExpand"
                     VerticalOptions="Center"
                     Padding="10"
                     BackgroundColor="LightGreen">
            <Label HorizontalOptions="Center"
                   VerticalOptions="Center"
                   Text="show result"
                   x:Name="label" />
        </StackLayout>
    </StackLayout>

</ContentPage>

Затем в ContentPage :

public partial class MainPage : ContentPage
{
    List<CountryClass> countryList = new List<CountryClass>();
    List<StateClass> stateList = new List<StateClass>();
    List<CityClass> cityList = new List<CityClass>();
    public MainPage()
    {
        InitializeComponent();
        List<CityClass> cityList1 = new List<CityClass>();
        cityList1.Add(new CityClass { CityName = "ACountry-State-A-City A" });
        cityList1.Add(new CityClass { CityName = "ACountry-State-A-City B" });
        cityList1.Add(new CityClass { CityName = "ACountry-State-A-City C" });
        cityList1.Add(new CityClass { CityName = "ACountry-State-A-City D" });

        List<CityClass> cityList2 = new List<CityClass>();
        cityList2.Add(new CityClass { CityName = "ACountry-State-B-City A" });
        cityList2.Add(new CityClass { CityName = "ACountry-State-B-City B" });
        cityList2.Add(new CityClass { CityName = "ACountry-State-B-City C" });
        cityList2.Add(new CityClass { CityName = "ACountry-State-B-City D" });

        List<CityClass> cityList3 = new List<CityClass>();
        cityList3.Add(new CityClass { CityName = "BCountry-State-A-City A" });
        cityList3.Add(new CityClass { CityName = "BCountry-State-A-City B" });
        cityList3.Add(new CityClass { CityName = "BCountry-State-A-City C" });
        cityList3.Add(new CityClass { CityName = "BCountry-State-A-City D" });

        List<CityClass> cityList4 = new List<CityClass>();
        cityList4.Add(new CityClass { CityName = "BCountry-State-B-City A" });
        cityList4.Add(new CityClass { CityName = "BCountry-State-B-City B" });
        cityList4.Add(new CityClass { CityName = "BCountry-State-B-City C" });
        cityList4.Add(new CityClass { CityName = "BCountry-State-B-City D" });

        List<StateClass> stateList1 = new List<StateClass>();
        stateList1.Add(new StateClass {Name = "ACountry-State-A" ,City = cityList1 });
        stateList1.Add(new StateClass {Name = "ACountry-State-B", City = cityList2 });

        List<StateClass> stateList2 = new List<StateClass>();
        stateList2.Add(new StateClass { Name = "BCountry-State-A", City = cityList3 });
        stateList2.Add(new StateClass { Name = "BCountry-State-B", City = cityList4 });

        countryList.Add(new CountryClass {Name = "CountryA",State = stateList1 });;
        countryList.Add(new CountryClass {Name = "CountryB",State = stateList2 });

        dropdown.ItemsSource = countryList;
        dropdown.SelectedItem = countryList[0];
    }

    private void dropdown_SelectedIndexChanged(object sender, EventArgs e)
    {
        var picker = (Picker)sender;
        int selectedIndex = picker.SelectedIndex;

        if (selectedIndex != -1)
        {
            stateList = countryList[selectedIndex].State;
            dropdown1.ItemsSource = stateList;
            dropdown1.SelectedItem = stateList[0];
        }
    }

    private void dropdown1_SelectedIndexChanged(object sender, EventArgs e)
    {
        var picker = (Picker)sender;
        int selectedIndex = picker.SelectedIndex;

        if (selectedIndex != -1)
        {
            cityList = stateList[selectedIndex].City;
            dropdown2.ItemsSource = cityList;
            dropdown2.SelectedItem = cityList[0];
        }
    }

    private void dropdown2_SelectedIndexChanged(object sender, EventArgs e)
    {
        var picker = (Picker)sender;
        int selectedIndex = picker.SelectedIndex;

        if (selectedIndex != -1)
        {
            label.Text = cityList[selectedIndex].CityName;
        }
    }
}

Класс Модель выглядит следующим образом:

CountryClass :

public class CountryClass
{
    public string Name { get; set; }
    public string Details { get; set; }
    public string ImageUrl { get; set; }

    public List<StateClass> State { get; set; }
}

StateClass :

public class StateClass
{
    public string Name { get; set; }
    public string Details { get; set; }
    public string ImageUrl { get; set; }

    public List<CityClass> City { get; set; }

}

CityClass :

public class CityClass
{
    public string CityName { get; set; }
}

Эффект следующим образом:

enter image description here

Примечание:

Если можно получать данные из веб-API или локальной базы данных, то создавать проверенные данные не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...