2017-10-20 46 views
1

J'ai un Picker dans mon formulaire Xamarin, lié à un modèle (code ci-dessous).Pourquoi la liaison ne met pas à jour l'élément sélectionné du sélecteur

La méthode Load définit SelectedVehicle mais le sélecteur ne montre pas le véhicule sélectionné. Lorsque la page est chargée pour la première fois, le sélecteur affiche l'élément correct dans la liste. Mais sur un rechargement de page après que App.VehicleId a été modifié, le sélecteur est vide.

Même si je mets explicitement SelectedIndex sur le sélecteur pendant OnAppearing, le sélecteur montre en blanc, et le SelectedIndex a été remis à -1 quand je regarde plus tard. Comment mettre à jour correctement la sélection du sélecteur lors du rechargement de la page?

Comment mettre à jour correctement la sélection du sélecteur lorsque la page est rechargée?

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> 

Le code est derrière ceci:

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 est une classe banale mise en œuvre INotifyPropertyChanged:

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

    public event PropertyChangedEventHandler PropertyChanged; 
} 

Répondre

0

Il se trouve le problème a été la création d'une nouvelle ObservableCollection. J'ai changé le code

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

et à la place effacé la collection existante, et ajouté les nouveaux enregistrements.