Xamarin表单设置Picker SelectedItem

时间:2017-11-25 09:38:00

标签: c# asp.net xamarin picker

我正在使用xamarin表单。 我正在使用Picker用于DropDownList。

如何将selectedItem设置为Picker?

我的代码

<Picker x:Name="VendorName" Title="Select" ItemDisplayBinding="{Binding VendorName}" SelectedItem="{Binding VendorName}" Style="{StaticResource PickerStyle}"></Picker>

和服务器端代码是

Device.BeginInvokeOnMainThread(() =>
{
VendorName.ItemsSource = VendorList;
});

var currentVendor = new List<Vendor>();
currentVendor.Add(new Vendor { VendorID = "111", VendorName = "aaaa" });

VendorName.SelectedItem = currentVendor;

3 个答案:

答案 0 :(得分:2)

这可能不是最有效的,但你可以循环找到索引并设置那样。

for (int x = 0; x <  VendorList.Count; x++)
        {
            if (VendorList[x].VendorName == currentVendor .VendorName )
            {
                VendorName.SelectedIndex = x;
            }
        }

答案 1 :(得分:1)

在Picker中添加所有值作为列表

只需将其视为数组

因此,如果您想设置所选项目,只需设置所选项目索引

currentVendor.SelectedIndex = 0;

零表示您选择的项目是您添加到Picker的第一个项目

答案 2 :(得分:0)

如果您使用的是MVVM,并且想从视图模型中设置SelectedItem,事情会变得很棘手。 Xamarin中似乎存在一个错误,该错误使我们无法通过双向绑定使用SelectedItem。更多信息:Xamarin Forms ListView SelectedItem Binding Issuehttps://xamarin.github.io/bugzilla-archives/58/58451/bug.html

幸运的是,我们可以轻松地编写自己的Picker

    public class TwoWayPicker : Picker
    {
        public TwoWayPicker()
        {
            SelectedIndexChanged += (sender, e) => SelectedItem = ItemsSource[SelectedIndex];
        }

        public static new readonly BindableProperty SelectedItemProperty = BindableProperty.Create(
            nameof(SelectedItem), typeof(object), typeof(TwoWayPicker), null, BindingMode.TwoWay, propertyChanged: OnSelectedItemChanged);
        public new object SelectedItem
        {
            get => GetValue(SelectedItemProperty);
            set => SetValue(SelectedItemProperty, value);
        }
        private static void OnSelectedItemChanged(BindableObject bindable, object oldValue, object newValue)
        {
            var control = (TwoWayPicker)bindable;
            control.SetNewValue(newValue);
        }
        private void SetNewValue(object newValue)
        {
            if (newValue == null)
            {
                return;
            }
            for(int i = 0; i < ItemsSource.Count; i++)
            {
                if (ItemsSource[i].Equals(newValue))
                {
                    SelectedIndex = i;
                    return;
                }
            }
        }
    }

因为使用相同的SelectedItem属性,所以它是Picker的直接替代。

请注意,如果要让项目类具有值相等性而不是引用相等性,则还需要像这样重写Equals

        public override bool Equals(object obj)
        {
            var other = obj as YourClass;
            if (other == null)
            {
                return false;
            }
            else
            {
                return other.SomeValue == SomeValue; // implement your own
            }
        }