6

c#/XAML を使用して Windows 8 アプリケーションに取り組んでいます。この行で次のエラーが発生するこのイベントハンドラーを除いて、すべてが機能しています。

RefreshUserInfoAsync(); を待ちます。

アプリケーションは、別のスレッド用にマーシャリングされたインターフェースを呼び出しました。(HRESULT からの例外: 0x8001010E (RPC_E_WRONG_THREAD))

この監視可能なコレクションは、アプリ クラスのプッシュ通知ハンドラーから更新されており、このイベント ハンドラーはビュー モデルにあります。MVVM Light のようなフレームワークは使用していません。これに関する他の投稿をいくつか見て、独自の Dispatcher Helper を作成しようとしましたが、Window.Current.Dispatcher が null である別のエラーを受け取りました。これを機能させる方法はありますか?

    private async void PushActions_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        string action = e.NewItems[0] as string;
        if(action != null)
        {
             await RefreshUserInfoAsync();
        }
    }


    private async Task RefreshUserInfoAsync()
    {
        var userInfos = await SessionRepository.GetSessionUsersWithInfoAsync(SessionGuid, RoundGuid);
        this.UserInfoList = new ObservableCollection<UserInfo>(userInfos);
    }

強調されたテキスト

4

1 に答える 1

18

私はジェフリー・リッチターと話をしました、そして彼は私に答えをくれました。ビューモデルから、CoreApplication.MainView.CoreWindowを介してディスパッチャーにアクセスできます。

更新は次のとおりです。

var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;

await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => {
    this.UserInfoList = new ObservableCollection<UserInfo>(userInfos);
});

これが他の誰かに役立つことを願っています。

マイク

于 2013-02-19T17:50:27.057 に答える