2013-10-16 4 views
9

私はWPFとPrismを使用する小さなアプリケーションを持っています。私は自分のシェルと2つのモジュールを持っています。私は彼らが正常にナビゲーションのために配線されていることを知っているので、私は正常にファッション(例えば、ボタンのクリックから)の間で正常にナビゲートすることができます。しかし、完了時にイベントを発生させる非同期操作を実行すると、そのイベントハンドラ内からナビゲートできなくなります。私が最後に試したことは、Event Aggregationを使用してイベントをUIスレッドに公開することでしたが、まだナビゲートしていません。イベントへのサブスクライバは、イベントを正常に取得し、RequestNavigate(...)を起動しますが、UIは更新されません。今Prismでコールバックメソッド内をナビゲートできません

、いくつかのコード: 私の最初のモジュールLoginModuleためのviewmodel:私は間違っているかもしれないものに

public class RosterViewModel : IRosterViewModel, INavigationAware 
{ 
    private readonly IEventAggregator _eventAggregator; 
    private readonly IRegionManager _regionManager; 

    [ImportingConstructor] 
    public RosterViewModel(IRegionManager regionManager, IEventAggregator eventAggregator) 
    { 
     _regionManager = regionManager; 
     _eventAggregator = eventAggregator; 

     _eventAggregator.GetEvent<UserAuthenticatedEvent>().Subscribe(o => 
     { 
      Console.WriteLine("Requesting navigation..."); 
      _regionManager.RequestNavigate(RegionNames.ContentRegion, new Uri(WellKnownViewNames.RosterView, UriKind.Relative)); 
     }); 
    } 

    public bool IsNavigationTarget(NavigationContext navigationContext) 
    { 
     return true; 
    } 

    public void OnNavigatedFrom(NavigationContext navigationContext) 
    { 

    } 

    public void OnNavigatedTo(NavigationContext navigationContext) 
    { 
     Console.WriteLine("I'm here at the RosterViewModel"); 
    } 
} 

任意のヒント:私の第二のモジュールRosterModuleため

public class LoginViewModel : ViewModelBase, ILoginViewModel, INavigationAware 
{ 
    ... 

    [ImportingConstructor] 
    public LoginViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator) 
    { 
     _regionManager = regionManager; 
     _container = container; 
     _eventAggregator = eventAggregator; 
    } 

    private DelegateCommand _Login; 
    public DelegateCommand Login 
    { 
     get 
     { 
      if (_Login == null) 
       _Login = new DelegateCommand(() => LoginHandler()); 
      return _Login; 
     } 
    } 
    private void LoginHandler() 
    { 
     _client = new JabberClient(); 
     _client.Server = "gmail.com"; 
     _client.User = Username; 
     _client.Password = Password; 

     ... 

     _client.OnAuthenticate += client_OnAuthenticate; 
     _client.Connect(); 
    } 

    private void client_OnAuthenticate(object sender) 
    { 
     Console.WriteLine("Authenticated!"); 
     _eventAggregator.GetEvent<UserAuthenticatedEvent>().Publish(""); 
    } 

    public bool IsNavigationTarget(NavigationContext navigationContext) 
    { 
     return true; 
    } 
    ... 
} 

のViewModel?そのわずか数分投稿後、私は昨日に走ったと私は逃した何かを見て記事を再読OP、[OK]を

から、

+0

なぜあなたはそれを答えにしませんでしたか? – HichemSeeSharp

+5

解決したコメントを回答にコピーして回答してください。これはいつか他の誰かを助けることができます。 –

+1

@ Jason:あなたの解答を答えに加え、答えとしてマークしてください。答えとしてマークしないと、同じ問題の解を探している人々は、リストに未回答。また、解決策を知っていて、それに答えることを望む人々は、この記事を読む時間を投資した後に失望するだろう。 –

答えて

1

...

http://neverindoubtnet.blogspot.com/2009/05/event-aggregator-in-prism-explorer.html

彼らはその1を説明Subscribeメソッドのオーバーロードのうち、ThreadOptionが含まれています。だから、

_eventAggregator.GetEvent<UserAuthenticatedEvent>() 
    .Subscribe(
    o => 
    { 
     Console.WriteLine("Requesting navigation..."); 
     _regionManager.RequestNavigate(
      RegionNames.ContentRegion, 
      new Uri(WellKnownViewNames.RosterView, UriKind.Relative)); 
    }, 
    ThreadOption.UIThread); 

そして今、それは動作します:

_eventAggregator.GetEvent<UserAuthenticatedEvent>() 
    .Subscribe(
    o => 
    { 
     Console.WriteLine("Requesting navigation..."); 
     _regionManager.RequestNavigate(
      RegionNames.ContentRegion, 
      new Uri(WellKnownViewNames.RosterView, UriKind.Relative)); 
    }); 

になりました!

うまくいけば、これは他の誰かが道を歩くのに役立ちます。

お楽しみください!

関連する問題