【问题标题】:Binding results got from Rest API to Picker Xamarin.Forms从 Rest API 到 Picker Xamarin.Forms 的绑定结果
【发布时间】:2020-11-23 00:51:16
【问题描述】:

我正在尝试将从 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() 方法有关,因为它是异步的。任何帮助都很有价值。

【问题讨论】:

  • 您的 XMCUsers 对象是否有一个名为 Full_Name 的有效字段,如果有,该字段是否从 API 调用中获取正确的数据?
  • 两者都是...
  • @ShpendPalushi 你好,你可以看看这个case,问题好像和你一样。

标签: xamarin xamarin.forms data-binding picker


【解决方案1】:

建议使用另一个类作为BindingContext (ViewModel)。

但是如果你想在你的ContentPage里面处理这个过程

ddProfession.ItemSource = ResultList;

或在您的ContentPage 中创建一个BindingProperty

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

【讨论】:

    【解决方案2】:

    只需使用 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 picker not showing the date from the list

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-17
      • 2021-06-29
      • 2014-11-12
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多