9

更新RaiseCanExecuteChangedナビゲーション中のCOM例外?

アップロードサンプルプロジェクト:https://github.com/subt13/BugSamples

私はMVVMLightフレームワークを利用してWindowsの10 UAPアプリケーションで発生されたエラーを再現しております。 CPUは、重い負荷(〜20から25パーセント)の下で、ページが「重い」(など大きな画像、コントロールの多くなど、)

ありながら

は私がナビゲーション中に以下のエラーが表示されます

at System.Runtime.InteropServices.WindowsRuntime.ICommandAdapterHelpers。 <> c__DisplayClass2.b__3(オブジェクト 送信者のEventArgs e)のSystem.EventHandler.Invokeで(オブジェクト送信者、 のEventArgs e)の RaiseExecuteChangeRepo.ViewModel.MainViewModel.d__17でGalaSoft.MvvmLight.Command.RelayCommand.RaiseCanExecuteChanged()で。 MoveNextメソッド()サンプルで

は、エラーがロードするために呼ばなっているExecuteLoadDataCommandAsync()に関連付けられているコマンド以外のナビゲーション中に何が起こっている特別なRaiseCanExecuteChanged();

private async void ExecuteLoadDataCommandAsync() 
    { 
     // cause the app to slow done. 
     var data = await Task.Run(() => GetData()); 

     if (data != null) 
     { 
      this.Data.Clear(); 

      foreach (var item in data) 
      { 
       this.Data.Add(new AnotherVM(item)); 
      } 
     } 

     // have the select job command rerun its condition 
     this.SelectCommand.RaiseCanExecuteChanged(); 
    } 

    // slow down the page 
    public List<DataItem> GetData() 
    { 
     var myList = new List<DataItem>(); 
     for (int i = 0; i < 100000; ++i) 
     { 
      myList.Add(new DataItem("Welcome to MVVM Light")); 

     } 

     return myList; 
    } 

ナッシングで発生しますデータ。再現する

<Core:EventTriggerBehavior EventName="Loaded"> 
    <Core:InvokeCommandAction Command="{Binding LoadDataCommand}"> 
    </Core:InvokeCommandAction> 
</Core:EventTriggerBehavior> 

は、単に数秒間急速に他のページへ切り替え、その後、待つだけ。あまり長すぎないと、例外が発生します。

+0

E_FAILは、WinRTでのエラー報告の品質に関する教師の等級です。基本的な問題を診断することは全く役に立たない。それは、非同期/待機のコードでスレッドの問題、常に非ゼロの確率である可能性があります。しかし、再びそれは何でもよい。あなたは信頼できるレトロなシナリオを見つけなければならないでしょうし、来週は何もするつもりはありません。 –

+0

@HansPassant - それに取り組んでいます。 –

+1

私が推測しているのは、「あるページから他のページへと数秒間すばやく切り替えてから、待ってから」ということです。 - あなたの 'async'操作はまだ実行されており、完了すると、もはやアクティブではないXAMLツリーと対話しようとします。修正するには、イベントを呼び出す前にまだアクティブページであることを確認してください。 –

答えて

1

次のイベントをコードの後ろに追加して問題を解決しました。

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    this.DataContext = null; 
    base.OnNavigatedFrom(e); 
} 
関連する問題