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

ModelINotifyPropertyChangedを実装些細なクラスです:

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()); 

を変更し、代わりに既存のコレクションをクリアし、そしてそれに新しいレコードを追加しました。

関連する問題