导航期间出现 RaiseCanExecuteChanged COM 异常?
RaiseCanExecuteChanged COM Exception during Navigation?
更新
上传的示例项目:https://github.com/subt13/BugSamples
我重现了在使用 MVVMLight 框架的 Windows 10 UAP 应用程序中发生的错误。
当 CPU 负载很重 (~20-25%) 并且页面 "heavy"(大图像、大量控件等,等等)
at
System.Runtime.InteropServices.WindowsRuntime.ICommandAdapterHelpers.<>c__DisplayClass2.b__3(Object
sender, EventArgs e) at System.EventHandler.Invoke(Object sender,
EventArgs e) at
GalaSoft.MvvmLight.Command.RelayCommand.RaiseCanExecuteChanged() at
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>
要重现,只需从一页快速切换到另一页几秒钟,然后等待即可。不久之后将引发异常。
我最终通过将以下事件添加到后面的代码来解决我的问题。
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
this.DataContext = null;
base.OnNavigatedFrom(e);
}
更新
上传的示例项目:https://github.com/subt13/BugSamples
我重现了在使用 MVVMLight 框架的 Windows 10 UAP 应用程序中发生的错误。
当 CPU 负载很重 (~20-25%) 并且页面 "heavy"(大图像、大量控件等,等等)
at System.Runtime.InteropServices.WindowsRuntime.ICommandAdapterHelpers.<>c__DisplayClass2.b__3(Object sender, EventArgs e) at System.EventHandler.Invoke(Object sender, EventArgs e) at GalaSoft.MvvmLight.Command.RelayCommand.RaiseCanExecuteChanged() at 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>
要重现,只需从一页快速切换到另一页几秒钟,然后等待即可。不久之后将引发异常。
我最终通过将以下事件添加到后面的代码来解决我的问题。
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
this.DataContext = null;
base.OnNavigatedFrom(e);
}