我正在使用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;
答案 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 Issue和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;
}
}
}
}
因为使用相同的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
}
}