9

GüncellemeNavigasyon sırasında RaiseCanExecuteChanged COM Özel Durum mu var?

Uploaded örnek projesi: Ben MVVMLight çerçevesini kullanan Windows 10 UAP uygulamasında ortaya çıkan edilmiş bir hata yeniden var https://github.com/subt13/BugSamples

. İşlemci ağır yük (~% 20-25) altında ve sayfa "ağır" (vs. büyük resimler kontrollerin sürü vb)

iken

Ben Navigasyon sırasında aşağıdaki hatayı alıyorsunuz

, System.Runtime.InteropServices.WindowsRuntime.ICommandAdapterHelpers. <> c__DisplayClass2.b__3 (Object sender, EventArgs e) System.EventHandler.Invoke (nesne gönderici, EventArgs e) RaiseExecuteChangeRepo.ViewModel.MainViewModel.d__17 de GalaSoft.MvvmLight.Command.RelayCommand.RaiseCanExecuteChanged() at. MoveNext() örneğinde

, hata yüklemek için denir oluyor ExecuteLoadDataCommandAsync() ilişkili komuta dışında navigasyon esnasında oluyor özel 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; 
    } 

hiçbir şey üzerinde oluşur veri.

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

basitçe hızla birkaç saniye boyunca diğer bir sayfadan diğerine geçiş ve sonra sadece bekleyin, yeniden oluşturmak için. Çok uzun bir süre sonra istisna kaldırılacaktır.

+0

E_FAIL, WinRT'deki hata bildiriminin kalitesiyle ilgili yalnızca bir öğretmenin notudur. Altta yatan sorunu teşhis etmek tamamen işe yaramaz. Async/await kodunda bir * threading problemi, her zaman sıfır olmayan oranlar olabilir. Ama sonra tekrar bir şey olabilir. Güvenilir bir repro senaryosu bulmanız gerekecek, gelecek hafta için hiçbir şey başarmayı planlamayın. –

+0

@HansPassant - Yup, bunun üzerinde çalışıyor. –

+1

Tahminimce "bir sayfadan diğerine hızlıca birkaç saniye geçiş yap ve sonra bekle." - "async" işlemleriniz hala çalışıyor ve tamamlandığında, artık aktif olmayan bir XAML ağacıyla etkileşimde bulunmaya çalışıyorlar. Düzeltmek için, etkinlikleri yükseltmeden önce hâlâ etkin sayfa olduğundan emin olun. –

cevap

1

Aşağıdaki olayı kodun arkasına ekleyerek sorunumu düzelttim.

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    this.DataContext = null; 
    base.OnNavigatedFrom(e); 
}