Xamarin 表单设置 Picker SelectedItem

Posted

技术标签:

【中文标题】Xamarin 表单设置 Picker SelectedItem【英文标题】:Xamarin forms set Picker SelectedItem 【发布时间】:2017-11-25 09:38:00 【问题描述】:

我正在使用 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;

【问题讨论】:

SelectedItem 应该是一个对象,而不是一个列表 非常非常感谢。工作顺利 【参考方案1】:

这可能不是最有效的,但您可以循环查找索引并以这种方式设置。

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

【讨论】:

【参考方案2】:

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

把它当作一个数组来处理

所以如果你想设置选中项只需设置选中项索引

currentVendor.SelectedIndex = 0;

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

【讨论】:

【参考方案3】:

如果您使用的是 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
            
        

【讨论】:

在 SetNewValue 中,您应该在 ItemsSource 上添加一个空检查,以防 SelectedItem 设置在 ItemsSource 之前。

以上是关于Xamarin 表单设置 Picker SelectedItem的主要内容,如果未能解决你的问题,请参考以下文章

更改 Xamarin Forms Picker 按钮样式 [重复]

Xamarin Forms Picker - iOS 上的“完成”文本

我们如何处理 Xamarin Forms Picker 的完成按钮单击事件?

Xamarin.Forms 中 Picker 的自定义渲染器

Xamarin.Forms DatePicker 时间

Xamarin 表单中的 UWP FormsComboBox 和 FormsTextBox 样式