2017-10-20 147 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()); 

,而是清除現有的集合,並添加了新的記錄它。

相關問題