Привязка результатов, полученных от Rest API, к Picker Xamarin.Forms - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь поместить результаты, полученные от API, в средство выбора. Так я и делаю.

 public partial class AddTaskPage : ContentPage
    {
        public AddTaskPage()
        {
            InitializeComponent();
            BindingContext = this;
        }

        private async void GetUsers()
        {
            using (var client = new HttpClient())
            {
                var uri = "http://diplomaxmcws-dev.us-east-2.elasticbeanstalk.com/api/Users/GetAllUsers";
                var result = await client.GetStringAsync(uri);
                var ResultList = JsonConvert.DeserializeObject<List<XMCUsers>>(result);
                Users = new ObservableCollection<XMCUsers>(ResultList);
                BindingContext = this; // for sureness
            }

        }

        public ObservableCollection<XMCUsers> Users { get; set; }

        protected override void OnAppearing()
        {
            GetUsers();
            BindingContext = this;  //for sureness
        }
    }

и в файле XAML.

    <Picker Margin="20,40,20,0"
                             HeightRequest="50" Title="Choose"
                            ItemsSource="{Binding Users}"
                            ItemDisplayBinding="{Binding Full_Name}"
                                 x:Name="ddProfession">

Из отладки я вижу, что свойство Users правильно получает результаты от API, но привязка ничего не покажет в представлении. Я не знаю, должен ли он что-то делать с методом GetUsers (), поскольку это asyn c. Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Просто используйте foreach и Add вместо инициализации новой коллекции, чтобы правильно уведомлять ItemSource об изменениях.

foreach (var item in ResultList)
{
    Users.Add(item);
}

Полный код:

public partial class AddTaskPage : ContentPage
    {
        public ObservableCollection<XMCUsers> Users { get; set; } = new ObservableCollection<XMCUsers>();

        public AddTaskPage()
        {
            InitializeComponent();
            BindingContext = this;
        }

        private async Task GetUsers()
        {
            using (var client = new HttpClient())
            {
                var uri = "http://diplomaxmcws-dev.us-east-2.elasticbeanstalk.com/api/Users/GetAllUsers";
                var result = await client.GetStringAsync(uri);
                var ResultList = JsonConvert.DeserializeObject<List<XMCUsers>>(result);
                foreach (var item in ResultList)
                {
                    Users.Add(item);
                }
            }

        }

        protected override async void OnAppearing()
        {
            await GetUsers();
        }
    }

Или другой подход: Xamarin сборщик не показывает дату из списка

0 голосов
/ 03 августа 2020

Желательно использовать другой класс для использования в качестве BindingContext (ViewModel).

Но если вы хотите, чтобы процесс был внутри вашего ContentPage

ddProfession.ItemSource = ResultList;

или создайте a BindingProperty внутри вашего ContentPage

public static readonly BindableProperty UserProperty = BindableProperty.Create(
        nameof(Users),
        typeof(XMCUsers),
        typeof(AddTaskPage),
        default(XMCUsers));

    public XMCUsers User
    {
        get => (XMCUser)GetValue(UserProperty);
        set => SetValue(UserProperty, value); 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...