2016-10-18 8 views
0

を待って、私の見解モデルでは、私は、私のデータベースの後ろに私のコードでXamarinは、SQLiteのに問題がフォームと私はsqliteのネット-PCL nugetを使用してい

private SQLiteAsyncConnection connection; 
    public ObservableCollection<Announcement> AnnouncementList { get; private set; } 

    public AnnouncementsViewModel() { 
     connection = DependencyService.Get<ISQLiteDb>().GetConnection(); 
     Initialize(); 
    }  

    public async void Initialize() { 
     await connection.CreateTableAsync<Announcement>(); 
     var announcements = await connection.Table<Announcement>().ToListAsync(); 
     AnnouncementList = new ObservableCollection<Announcement>(announcements); 
     System.Diagnostics.Debug.WriteLine("***********************************"); 
     System.Diagnostics.Debug.WriteLine(AnnouncementList.Count); 
    } 

からのお知らせの一覧を取得しようとしていますコンストラクタで:

BindingContext = new AnnouncementsViewModel(); 
InitializeComponent(); 
var list = (BindingContext as AnnouncementsViewModel).AnnouncementList; 

私が手にエラーがある:

System.NullReferenceException:オブジェクト参照インスタンスに設定されていませんオブジェクトの。

私はviewModelにブレークポイントを設定します。最初のコードに到着すると、コードが背後に戻り、アプリケーションがクラッシュします。 AnnouncementListがviewModelに埋め込まれておらず、星印が印刷されなかったため、null例外が発生します。 この問題を解決するにはどうすればよいですか?

おかげ

+0

例外のコールスタックは何ですか? –

+0

'(BindingContext as AnnouncementsViewModel)'私はこれがヌルであると確信しています – Alex

+0

@ j0ey_wh私はこの行にブレークポイントを設定します。タイプを解決できませんでした:AnnouncementsViewModel – Mireille

答えて

0

あなたはちょうどそのような同期方法であなたの非同期Initialize()メソッドを呼び出すことはできません。すぐに戻り、AnnouncementListを使用するまでにInitializeはまだ実行されておらず、まだヌルです。

これは理想的な解決策ではありませんが、Initialize()の後に.Wait()を追加して、コンストラクターを終了する前に完了させる必要があります。

あなたの文脈によってはWait()がブロックされる可能性があるため、「理想的ではない」と言います。それが起こった場合は、ViewModelを構築する前に、「適切な」ものだけを待ってから、AnnouncementsListをコンストラクタに渡す前に、その初期化作業を行う方が良いでしょう。

+0

Initialize()が返されるために.Wait()が返されませんでしたvoid私はViewModelを変更しました – Mireille

+0

その特定の問題を解決するには戻り値の型はTaskに渡されます。 – sellotape

+0

私は実行すると黒い画面しか表示されない – Mireille

0

新しいViewModelに:の後ろに私のコードでは次に

public AnnouncementsViewModel() { 
     connection = DependencyService.Get<ISQLiteDb>().GetConnection(); 
    } 
    public async void GetAnnouncement() { 
     await connection.CreateTableAsync<Announcement>(); 
     var announcements = await connection.Table<Announcement>().ToListAsync(); 
     AnnouncementList = new ObservableCollection<Announcement>(announcements);   System.Diagnostics.Debug.WriteLine("***********************************"); 
     System.Diagnostics.Debug.WriteLine(AnnouncementList.Count); 
    } 

protected override async void OnAppearing() { 
     (BindingContext as AnnouncementsViewModel).GetAnnouncement(); 
     if ((BindingContext as AnnouncementsViewModel).list != null) 
      classAnnouncementListView.ItemsSource = (BindingContext as AnnouncementsViewModel).list; 
     base.OnAppearing(); 
    } 
+0

答えを追加するのではなく、質問を編集して追加します。 – sellotape

関連する問題