2017-06-01 8 views
0

私のアプリケーションにはMVVM Lightが使用されており、ページ間を行き来するためのINavigationServiceも実装されています。ViewModelイベントが複数回発生する

だから一般的なシナリオでは、この

メインページ>カテゴリ>ラウンド>データページのようなものです。

DataPageでは、結果を取得する要求を出しています。コールバックから返された結果に応じて、スタックから現在のページをポップしてラウンドに戻るために.GoBack()メソッドを呼び出します。

私が気付いたのは、DataPageを最初に起動して.GoBack()が呼び出された後、別のラウンドをタップすると、コールバックメソッドが2回呼び出され、3回前に戻るとこのように続けます。

これは、.GoBack()が再び呼び出され、ナビゲーションがうまくいかないことを意味します。

これは以前のVMをクリーンアップしないことと関係していると思いますが、SimpleIOCのUnRegister/Registerクラスでこの動作を変更しようとしましたが、不運です。

+0

あなたが入力したときにイベントをフックしかし、あなたが去るときにそれをアンフックしていないように聞こえます。コールバック内のイベントからコールバックを削除します。 – Slepz

+0

@Slepz私はそれをやろうとしていましたが、別のやり方で、私の提案した答えをチェックし、あなたのコメントを教えてください。 –

答えて

0
のViewModelクラスで

public void UnsubscribeFromCallBack() 
{ 
    this.event -= method; 
} 
.xaml.csページで

protected override void OnDisappearing() 
    { 
     base.OnDisappearing(); 
     PageViewModel vm = (this.BindingContext as PageViewModel); 
     vm.UnSubscribeFromCallback(); 
    } 
+0

これはうまくいくはずです – Slepz

+0

@Slepzはmvvmパターンを考えていますが、これはもっと効率的な方法で書くことができると思いますか? –

+0

これらのビューモデルとビューを再利用していて、コンテキストの詳細を知らなくても、これが最善の方法だと思います。また、イベントをviewmodelコンストラクタでフックし、デストラクタでフックを解除することもできます。その後、OnAppearingとOnDisappearingを使用してイベントを無視するかどうかのフラグを設定します(無視する必要がある場合でも) – Slepz

関連する問題