[英]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.