导航期间RaiseCanExecuteChanged COM异常

本文关键字:COM 异常 RaiseCanExecuteChanged 导航 | 更新日期: 2023-09-27 18:13:00

更新

上传的示例项目:https://github.com/subt13/BugSamples

我复制了一个在使用MVVMLight框架的Windows 10 UAP应用程序中发生的错误。

我在导航过程中收到以下错误,而CPU负载很重(约20-25%(,页面"很重"(大图像、大量控件等(

在System.Runtime.InteropServices.WindowsRuntime.ICommonAdapterHelpers。<>c__DisplayClass2.b_3(对象sender,EventArgs e(在System.EventHandler.Invoke(Object sender,EventArgs e(GalaSoft.MvvvmLight.Command.ReasyCommand.RiseCanExecuteChanged((位于RaiseExecuteChangeRepo.ViewModel.MainViewModel.d_17.MoveNext((

在样本中,错误发生在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;
    }

在导航过程中,除了调用与ExecuteLoadDataCommandAsync()关联的命令来加载数据之外,没有发生任何特殊情况。

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

要复制,只需从一个页面快速切换到另一个页面几秒钟,然后等待即可。过不了多久就会引发异常。

导航期间RaiseCanExecuteChanged COM异常

我通过在代码后面添加以下事件来解决问题。

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