xamarin - 如何通过在 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;
}
我不知道为什么,但这不起作用。
<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>
解决方案
为了解释这一点,我生成了一些测试数据来展示如何实现它,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 或本地数据库接收数据,则不需要创建测试数据。
推荐阅读
- javascript - Vue GET Data w/Axios“超出最大递归更新”
- java - 如何从速度和时间(不是从位置点)计算行驶距离:Android(Java)
- python - 如何在 csv 文件中有一个索引列以增加数量随时使用 python 追加新行?
- android - 获取类型不匹配:推断类型为 List 但应为 Collection
- flutter - 将数据从一个小部件传递到同一树中的另一个小部件
- r - R错误中的Knn“'test'和'train'的暗淡不同”
- java - 函数返回不正确的值
- java - 尝试使用 FileProvider 构建 android 项目时出现“错误:包 androidx.core.content 不存在”
- python - Python多处理导入类酸洗错误
- jquery - 在textarea jquery中单击输入时发送表单