【问题标题】:Why is binding not updating picker selected item为什么绑定不更新选择器选定项
【发布时间】:2017-10-20 10:33:19
【问题描述】:

我的 Xamarin 表单中有一个 Picker,绑定到一个模型(代码如下)。

Load 方法设置了SelectedVehicle,但选择器不显示所选车辆。首次加载页面时,选择器会在列表中显示正确的项目。但是在更改App.VehicleId 后重新加载页面时,选择器显示为空白。

即使我在OnAppearing 期间在选择器上明确设置了SelectedIndex,选择器仍显示为空白,并且当我稍后查看时SelectedIndex 已设置回-1

重新加载页面时如何正确更新选择器选择?

Xaml:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DefectReport"
             x:Class="DefectReport.MainPage">
    <ContentPage.Content>
        <ScrollView>
            <StackLayout>
                <Label x:Name="Message" TextColor="Red" />
                <Label Text="Welcome to Vehicle Check" />
                <Label Text="Choose vehicle" />
                <Picker ItemsSource="{Binding Vehicles}" ItemDisplayBinding="{Binding RegistrationNumber}" SelectedItem="{Binding SelectedVehicle}" SelectedIndexChanged="Picker_SelectedIndexChanged" />
                <Label Text="{Binding SelectedVehicle.Description}" />
                <Button Text="Add vehicle not in list" Clicked="SelectVehicle_Clicked" />
                <Button Text="Check vehicle" Clicked="CheckVehicle_Clicked" />
                <Button Text="Log out" Clicked="LogOut_Clicked" />
            </StackLayout>
        </ScrollView>
    </ContentPage.Content>
</ContentPage>

后面的代码是这样的:

public partial class MainPage : ContentPage {
    public class VehicleInfo : Model {
        public async void Load() {
            Vehicles = new ObservableCollection<Vehicle>(await App.Database.ReadAsync<Vehicle>().ToListAsync());
            SelectedVehicle = Vehicles.FirstOrDefault(v => v.DeviceRecordId == App.VehicleId) ?? Vehicles.FirstOrDefault();
            System.Diagnostics.Debug.WriteLine("App.VehicleId = " + App.VehicleId);
            System.Diagnostics.Debug.WriteLine("SelectedVehicle.Id = " + selectedVehicle.DeviceRecordId);
        }

        private Vehicle selectedVehicle;

        public Vehicle SelectedVehicle {
            get { return selectedVehicle; }
            set {
                if (selectedVehicle != value) {
                    selectedVehicle = value;
                    OnPropertyChanged("SelectedVehicle");
                }
            }
        }

        private ObservableCollection<Vehicle> vehicles;

        public ObservableCollection<Vehicle> Vehicles {
            get { return vehicles; }
            set {
                if (vehicles != value) {
                    vehicles = value;
                    OnPropertyChanged("Vehicles");
                }
            }
        }

    }
    VehicleInfo data;
    public MainPage() {
        data = new VehicleInfo();
        BindingContext = data;
        InitializeComponent();
    }

    protected override void OnAppearing() {
        base.OnAppearing();
        data.Load();
    }

Model 是一个实现INotifyPropertyChanged 的普通类:

public class Model : System.ComponentModel.INotifyPropertyChanged {
    public void OnPropertyChanged(string name) {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

【问题讨论】:

    标签: c# xamarin binding picker


    【解决方案1】:

    原来问题在于创建一个新的ObservableCollection。我改了代码

    Vehicles = new ObservableCollection<Vehicle>(await App.Database.ReadAsync<Vehicle>().ToListAsync());
    

    而是清除现有集合,并向其中添加新记录。

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      相关资源
      最近更新 更多