2016-10-26 11 views
0

私は部分的なCarouselLayoutでアプリケーションを作成しました。Xamarin Forms PCL - Navbarタイトルは動的に更新されません

MessagingCenter.Subscribe<CarouselLayout, string>(this, "ContentChanged", (sender, arg) => 
    { 
    Debug.WriteLine("ContentChanged rootpage subscribe"); 
    UpdateDateTitle(); 
    }); 

public void UpdateDateTitle() 
{ 
    this.Title = _viewModel.CurrentPage.RegList.First().DateTime.ToString("D"); 
} 
:私はMessageCenter

 MessagingCenter.Send<CarouselLayout, string>(this, "ContentChanged", "123"); 

で、私はそれのために聞いている私のRootPageにメッセージを送るよ、と、私はタイトルを更新したいcontentChangedレイアウトで

デバッグ出力とタイトルで、新しい日付で更新されていることがわかります。ただし、実際のナビゲーションバーのタイトルは更新されません。

ただし、初期ロード時に設定されます。

何が間違っていますか?

+0

複数のプラットフォームで試しましたか?あなたの 'RootPage'はどんなタイプですか? James Montemagnoが[Evolve app](https://github.com/xamarinhq/app-evolve/blob/master/src/XamarinEvolve.Clients.UI/Pages/Speakers)に汗をかいていないように見えるので、これはうまくいくはずです。 /SpeakerDetailsPage.xaml.cs) –

+0

私はDevice.BeginInvokeOnMainThreadで実装しました。その動作は悪い習慣ですか? - 私のルートページはContentPageです –

+0

ああ良い!それは悪い習慣ではありません。あなたが行く方法である別のスレッドからUIの何かを更新したい場合: –

答えて

1

あなた自身が議論し発見したように、Device.BeginInvokeOnMainThreadを使用してこれを呼び出す必要があります。

MessagingCenterは別のスレッドを使用し、UIを更新してUIスレッドに入れないようにすることはできません。

それは次のようになります。

MessagingCenter.Subscribe<CarouselLayout, string>(this, "ContentChanged", (sender, arg) => 
{ 
    Device.BeginInvokeOnMainThread (() => { 
     Debug.WriteLine("ContentChanged rootpage subscribe"); 
     UpdateDateTitle(); 
    }); 
}); 

は、それが正確に何をするかhere上に読んでください。

+1

まあ、私はそれにあなたを打ち負かす:)私は確信しても受け入れるよ確認のためにありがとう –

+0

ハありがとう!私の意図ではなく、アーカイブ目的で完了すると思った –

関連する問題