簡體   English   中英

Xamarin.forms 設置Picker SelectedItem

[英]Xamarin forms set Picker SelectedItem

我正在使用 xamarin Forms。我正在為 DropDownList 使用Picker

如何將 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;

這可能不是最有效的,但您可以循環查找索引並以這種方式設置。

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

在選擇器中將所有值添加為列表后

把它當作一個數組

所以如果你想設置選定的項目只需設置選定的項目索引

currentVendor.SelectedIndex = 0;

零表示您選擇的項目是您添加到 Picker 的第一個項目

如果您正在使用 MVVM,並且想要從視圖模型中設置SelectedItem ,事情就會變得棘手。 Xamarin 中似乎存在一個錯誤,阻止我們使用具有雙向綁定的SelectedItem 更多信息: Xamarin Forms ListView SelectedItem 綁定問題https://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;
                }
            }
        }
    }

因為 is 使用相同的SelectedItem屬性,所以它是Picker替代品。

請注意,如果您希望 item 類的值相等而不是引用相等,您還需要像這樣覆蓋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
            }
        }

如果將項目 class 定義為記錄而不是 class,則它可以使用 SelectedItem 屬性以編程方式 select 項目。

在你的情況下改變

public class Vendor  { // your class properties }

public record Vendor  { // your class properties }

這現在可以工作

VendorName.SelectedItem = currentVendor;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM