2017-06-23 24 views
1

MessagingCenter.Subscribe()内に記述された機能は、アプリケーションで複数回前後に移動すると複数回呼び出されます。しかし、購読するたびに、次のようにコンストラクタで同じものを購読解除しますが、それでもうまくいきませんでした。私は6ページ(git)を持っていると私はMessagingCenter.Sendと同じと6ページ目のデータが2ページ目に加入し、メッセージを保存されます保存私のアプリケーションでXamarin form MessagingCenterのサブスクリプションが期待どおりに動作しない

MessagingCenter.Unsubscribe<SubmitPage>(this,"Save"); 
MessagingCenter.Subscribe<SubmitPage>(this, "Save", (sender) => 
{ 
    DisplayToastOnSuccessfulSubmission(); 
}); 

に移動した後、(2ページ目に表示されますそのページ)。

この場合、DisplayToastOnSuccessfulSubmission()は2回呼び出されます(Page2のコンストラクタが2回呼び出されるため)2-> 1-> 2-> 3-> 4-> 5-> 6のようにナビゲートします。

私は、OnAppearingに同じコードを配置しようとしました。 私はOnDisappearで退会できません。私は、保存のためにPage6に達したときまでイベント配線が必要です。

は、サンプルプロジェクトで同じ動作を再現し、ここhttps://github.com/suchithm/MessageCenterSampleApp
Drop box link

を追加し、これを行うための適切な方法は何ですか?

+0

を私は今、解決策を持っていないが、私は問題を参照してくださいと思います。あなたはコンストラクタを呼び出しているので、新しいインスタンスです。 'this'はもう同じインスタンスではありません。つまり、イベントは実際には最初のインスタンスでは購読解除されません。 –

+0

完全に新しいインスタンスであれば、各ナビゲーションでもう1回呼び出す方法 – Suchith

+0

私の推測では、最初のインスタンスは削除されていません。 –

答えて

1

ただし、購読するたびに、次のようにコンストラクタで同じものを購読解除しますが、まだ動作しませんでした。 あなたのコード内のページ2の2つのインスタンス、それらの両方Unsubscribeが機能しなかった理由ですMessagingCenter.Subscribe()方法を、使用があるので

MessagingCenter.Subscribe()は、複数回呼び出されます。

プロジェクトでPage2のインスタンスが1つだけ存在であることを確認するためにシングルトンpage2()を変更することができ、その後、あなたがメッセージを送信するとき、 MessagingCenter.Subscribe()は一度だけ呼ばれます。

Page2.cs:

MessagingCenter.Send(Page2.GetPage2Instance(), "SaveToastPage2"); 

EDIT

Page2クラスのコンストラクタを宣言すると、そこを確認するために、民間することを覚えておいてください

public static Page2 instance = new Page2(); 

public static Page2 GetPage2Instance() 
{ 
    if(instance == null) 
    { 
     return new Page2(); 
    } 
    return instance; 
} 

private Page2() 
{ 
    InitializeComponent(); 
    MessagingCenter.Unsubscribe<Page2>(this, "SaveToastPage2"); 
    MessagingCenter.Subscribe<Page2>(this, "SaveToastPage2", (sender) => 
    { 
     DisplayToastOnSuccessfulSubmission(); 
    } 
} 

は、あなたがメッセージを送信あなたのプロジェクトで確かにPage2のインスタンスの1つだけです。

private Page2() 
{ 
    ... 
} 

あなたPage1.csコードに変更します

async void Handle_Next(object sender, System.EventArgs e) 
{ 
    await App.NavigationRef.PushAsync(Page2.GetPage2Instance(), true); 
} 
+0

前述のようにシングルトンクラスを追加しましたが、それでも複数回呼び出します。 – Suchith

+0

コードをgithubで更新してください。私は解決策を見つけようとします。 –

+0

@Suchith、私は私の答えを更新しました。それを確認してください。 –

関連する問題