如何在Xamarin表单中为Picker设置值

时间:2018-07-10 19:24:34

标签: c# xaml xamarin xamarin.forms

您好,我正在研究xamarin Forms 3.0项目,并且我正在使用Picker选择值,并使用它们将用户数据显示给Picker。现在我的问题是我无法将用户选择的值从数据库显示给Picker。请帮助...

背后的代码

下面是我将数据传递到此页面的页面构造函数

public SummaryDetail(CpDetails cp)
        {
            InitializeComponent();
            if (cp == null)
            {
                throw new System.ArgumentNullException(nameof(cp));
            }
            GetLocations();
            BindingContext = cp;

            pklocation.SelectedIndex = cp.LocationId;
}
public async void GetLocations()
        {
        var loci = new List<Locations>();
        var client = new HttpClient();


        var json = await client.GetStringAsync("this is the link from where i am getting other values in picker");
        loci = JsonConvert.DeserializeObject<List<Locations>>(json);

        pklocation.ItemsSource = loci;
    }

Xaml是

<Picker x:Name="pklocation" Title="Select Location" ItemDisplayBinding="{Binding Name}"/>

3 个答案:

答案 0 :(得分:2)

pklocation.SelectedIndex = cp.LocationId;这似乎是不正确的。

SelectedIndex表示ItemsSource中集合中的索引。它不知道如何选择哪个ID。因此,您需要找出列表中所选对象的索引,然后将SelectedIndex设置为该索引。但是可能更容易的是设置SelectedItempklocation.SelectedItem = cp;

以防万一,请尝试以下操作:

pklocation.SelectedItem = ((List<Locations>)pklocation.ItemsSource).FirstOrDefault(c => c.LocationId == cp.LocationId);

尽管那样,我还是建议在更全局的级别上保存loci变量,以便您可以从GetLocations方法中引用它。

有关Microsoft文档的更多信息:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/picker/

答案 1 :(得分:0)

感谢@Gerald Versluis的帮助,但我已经通过使用数组添加项来完成它,然后通过如下比较GetLocation()本身的索引来将SelectedIndex设置为选定值...

private int selectedLocation;
 public SummaryDetail(CpDetails cp)
        {
            InitializeComponent();

            GetLocations();
            BindingContext = cp;                
            selectedLocation = cp.LocationId;    
}
public async void GetLocations()
        {
            var loci = new List<Locations>();
            var client = new HttpClient();   

            var json = await client.GetStringAsync("this is link");
            loci = JsonConvert.DeserializeObject<List<Locations>>(json);
            foreach (var item in loci)
            {
                pklocation.Items.Add(item.Name);
                if (item.Id == selectedLoacion)
                    pklocation.SelectedIndex = item.Id;
            }

        }

答案 2 :(得分:0)

对我来说,绑定到 ViewModel 就像这样。

XAML

<Picker x:Name="gender" Title="Select Gender" TitleColor="Blue" SelectedItem="{Binding Gender}">

视图模型代码

public Object _gender;

        public Object Gender
    {
        get { return _gender; }
        set
        {
            _gender = value;
            OnPropertyChanged();
        }
    }

在从数据库中检索数据的函数内

Gender = (string)profile["gender"];