Xamarin Picker не обновляется после вызова API - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть средство выбора xamarin, которое должно отображать список стран после получения их из API (из viewmodel), но когда я устанавливаю источник данных в переменную List, средство выбора не обновляется.

public Departures(DeparturesViewModel mod)
{
    InitializeComponent();
    model = mod;
    GetCountryData();
}

private async void GetCountryData()
{
    var res= await model.SetCountries();// load api data
    CountryPikcer.IsEnabled = true; 
    CountryPikcer.ItemDisplayBinding = new Binding("Name");//Set the name property as the display property
    CountryPikcer.ItemsSource = model.FilterCountries("");//get loaded List<Country>
}

ViewModel:

private List<Country> countries;


public int CountryId
{
    get { return countryId; }
    set { SetProperty(ref countryId, value); }
}

public DeparturesViewModel()
{
    api = new ApiCaller();
    countries = new List<Country>();
}

public async Task<bool> SetCountries()
{
    countries = await api.GetAll<List<Country>>("Countries");
    return true;
}

public List<Country> FilterCountries (string text)
{
    if (text == "")
        return countries;
    List<Country> filtered = countries.Where(x => x.Name.Contains(text)).ToList();
    return filtered;
}

Внутри отладчика заполняется свойство ItemsSource, но средство выбора не observe

1 Ответ

1 голос
/ 08 февраля 2020

На мой взгляд, ваша проблема в модели представления. Вы используете вызов asyn c, это означает, что все ваши элементы управления были обработаны до того, как станут доступны данные из вызова asyn c. В этом случае ваша viewmodel должна реализовывать INotifyPropertyChanged. Затем, например:

public List<Country> Countries
{
    {
      set { countries = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Countries))); }
      get { return countries; }    
    }
}

Для обеспечения правильного обновления данных элементов управления.

...