【发布时间】:2022-01-14 03:13:51
【问题描述】:
我正在尝试制作一个显示国家列表的应用程序,当单击一个国家/地区时,它会显示该国家/地区的城市列表。
Country.cs:
public class Country {
public string Name { get; set; }
public ImageSource Image { get; set; }
public IList<City> Cities { get; set; }
}
City.cs:
public class City
{
public string Name { get; set; }
}
在 CountryPageViewModel.cs 中通过以下方式进行导航:
async void OnSelectedCountry(Country country)
{
if (country == null)
{
return;
}
await Shell.Current.GoToAsync($"{nameof(CitiesPage)}?{nameof(CitiesViewModel.Name)}={country.Name}");
}
城市被加载到 CitiesViewModel.cs 中:
[QueryProperty(nameof(Name), nameof(Name))]
public class CitiesViewModel : BaseViewModel
{
private string countryName;
public IList<City> CityList { get; set; }
public string Name
{
get
{
return countryName;
}
set
{
countryName = value;
LoadCities(value);
}
}
public async void LoadCities(string countryName)
{
try
{
Country country = await DataStore.GetItemAsync(cityName);
IList<City> cities = country.Cities;
CityList = cities;
}
catch (Exception)
{
Console.WriteLine("Impossible to load cities");
}
}
}
在 XAML (CitiesPage.xaml) 中:
<CollectionView x:Name="citiesCollectionView" x:DataType="viewmodels:CitiesViewModel"
ItemsSource="{Binding CityList}"
EmptyView="Impossible to load cities" >
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="5" x:DataType="models:City">
<Frame Style="{StaticResource CityCard}">
<Grid RowDefinitions="Auto,Auto"
ColumnDefinitions="Auto" >
<Label Grid.Column="1"
Text="{Binding Name}"
FontAttributes="Bold"
VerticalTextAlignment="Center"
Padding="10"
HeightRequest="50" />
</Grid>
</Frame>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
但“城市”页面中没有显示任何内容。我已将 CitiesPage.xaml.cs(代码隐藏)中的 BindingContext 设置为 ViewModel。
我做错了什么?
【问题讨论】:
-
您的二传手似乎都没有致电
PropertyChanged。LoadCities中的代码似乎引用了几个未定义的变量。这是剪切/粘贴错误,还是实际代码是这样的?您是否对其进行了调试以验证是否已加载数据? -
LoadCities中的未定义变量是剪切/粘贴错误,因为我试图将它们翻译成英文,regione在代码中代表Country。我需要修改和添加哪些setterPropertyChanged? -
你正在绑定到
CityList,所以你需要在设置时提高PropertyChanged -
成功了!感谢您的宝贵时间,这真的很有帮助!
标签: c# xaml xamarin xamarin.forms data-binding