首页 > 解决方案 > 如何通过在 Xamarin Forms 中选择另一个下拉列表来动态更改下拉列表值

问题描述

原谅命名。我正在尝试在 Xamarin Forms 中动态加载下拉列表(目的是创建一个注册表单,用户有多个问题要回答,我不想重复这个问题)

    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;            
    }

我不知道为什么,但这不起作用。

Xamarin 代码和屏幕在此处输入图像描述

      <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>

标签: xamarinxamarin.forms

解决方案


为了解释这一点,我生成了一些测试数据来展示如何实现它,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;
        }
    }
}

模型类是 flolow :

国家级

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

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

状态类

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

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

}

城市等级

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

效果如下:

在此处输入图像描述

笔记 :

如果可以从 web api 或本地数据库接收数据,则不需要创建测试数据。


推荐阅读