绑定 xamarin 表单选择器值的正确方法

Posted

技术标签:

【中文标题】绑定 xamarin 表单选择器值的正确方法【英文标题】:Correct way of binding xamarin forms picker value 【发布时间】:2019-09-22 08:41:03 【问题描述】:

我的问题是我有 2 个选择器控件。这些选取器控件中的 1 个绑定到列表 a,这些选取器控件之一绑定到列表 b。这两个控件都显示了我需要它们的数据,并且正确的显示绑定工作正常。

我的问题是当我绑定 selectedItem 属性时,它适用于列表 a,但不适用于列表 b。我已经检查过该代码实际上是彼此相似的副本。

我一直在使用 syncfusion Combobox,但切换到选择器,因为我认为这里有问题但没有。无论发生什么,都完全取决于我在做什么。

使用场景是我从我的 API 中提取支付类型列表并基于此填充选择器。这行得通。

我的主视图的数据源包含一个 ID。当我修改记录时,我运行一个名为 update 的方法来查找 selectedItem。我对这种方法不满意,有兴趣看看其他人使用什么。

更新方法获取选择器的数据源并找到我期望的选定项。这也可以正常工作,但不绑定。

 [Serializable]
    public class PaymentInformation :BaseModel 
    

        public int? ID  get; set; 

        public DateTime? StartDate  get; set; 

        public DateTime? EndDate  get; set; 

        public int? PaymentTypeId  get; set; 

        public string PaymentTo  get; set; 

        public string Location  get; set; 

        public string Notes  get; set; 

        public PersonInformation PersonBudget  get; set; 

        public decimal AmountPaid  get; set; 

        public decimal AmountReceived  get; set; 

        public double TotalHours  get; set; 

        public void Update(ObservableCollection<ResourceInformation> resources , ObservableCollection<PaymentTypeInformation> paymentTypes)
        
           if(PaymentTypeId != null) this.PaymentTypeInformation1 = paymentTypes?.FirstOrDefault((paymentType) => paymentType.ID == PaymentTypeId.Value);
            this.Resource = resources?.FirstOrDefault((resource) => resource.ResourceId == PersonBudget?.ID);
        

        private PaymentTypeInformation _paymentTypeInformation;

        private PaymentTypeInformation PaymentTypeInformation1  get  return _paymentTypeInformation;  set  _paymentTypeInformation = value; OnPropertyChanged(nameof(PaymentTypeInformation1));  

        private ResourceInformation _resource;

        public ResourceInformation Resource  get  return _resource;  set  _resource = value; OnPropertyChanged(nameof(Resource));  

    

底层xaml是:

 <Label Grid.Row="8" Grid.Column="0" Text="Payment Type:" />
            <Picker BackgroundColor="White" Grid.Row="8" Grid.Column="1" ItemsSource="Binding PaymentTypesDataSource"  ItemDisplayBinding="Binding Path=DisplayText" IsEnabled="Binding IsProcessing, Converter=StaticResource reverseBoolConvertor" SelectedItem="Binding DataSource.PaymentTypeInformation1, Mode=TwoWay" />

预期的结果是下拉菜单使用未初始化的 selectedItem 进行初始化(在一个使用场景中 - 另一个可以正常工作)。

【问题讨论】:

您的问题是关于绑定的,但您没有显示您的实际绑定,而且您发布的代码并没有真正包含足够的上下文来证明您遇到的问题。 同意,使用实际代码示例更新帖子。 【参考方案1】:

只见树木不见森林。

private PaymentTypeInformation PaymentTypeInformation1
 
    get
    
        return _paymentTypeInformation;
    
    set
     
        _paymentTypeInformation = value;
        OnPropertyChanged(nameof(PaymentTypeInformation1));
     

无法绑定到私有属性 - 更改为公共属性并立即生效。坚持了一天,真是难以置信。

【讨论】:

这是对您问题的回答还是补充?! 这回答了我自己的问题

以上是关于绑定 xamarin 表单选择器值的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

onAppear 不允许保存/更新选择器值的更改?

xamarin 表单 - 与选择器的两种方式绑定 - 为啥我不能从后面的代码更新选择器?

如何更改各种微调器值的 EditText 字段

如何在 xamarin 表单中刷新选择器控件的 UI

使用 jQueryUI 获取日期选择器值

来自先前选择器的选择器值 - CoreData/SwiftUI