2017-10-20 177 views
1

我的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; 
} 

回答

0

原来,这个问题是创建一个新的ObservableCollection。我改变了代码

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

,而是清除现有的集合,并添加了新的记录它。

相关问题