我正在构建一个UWP应用程序。在我的一个页面上,我总是遇到标题中列出的异常。
这就是这个场景。应用程序将加载。我导航到我的运输页面(导致问题的那个页面),它加载正常。然后我导航到另一个页面,但是当我试图返回到运输页面时,我在App.g.i.cs文件中遇到了未处理的异常。
异常中唯一的消息是:“参数不正确。\r\n”
我不知道这是什么原因。如果我在后面的运输代码中的OnNavigatedTo事件的代码中放了一个断点,它会加载ViewModel,然后我就会遇到这个错误:
public ICommand TransitButtonCommand
{
get
{
return _TransitButtonCommand ??
new RelayCommand(() =>
{
_navigationService.Navigate(typeof(TransitView));
});
}
}解决这个问题的唯一方法是将: NavigationCacheMode="Required“放在运输视图的XAML文件中,但这并不是最优的,因为这个页面显示火车/公共汽车时刻表,而我需要在每次加载时更新它。
有人知道为什么会发生这种事吗?我很高兴从项目中提供更多的代码来帮助解决这个问题。
我的运输页面由一个SplitView组成,我根据选择的菜单项将另一个XAML页面加载到其中。
我创建了一个小项目,并将其放在GitHub上以演示此错误,您可以在此处找到它:https://github.com/marekt77/SplitViewBindingTest
运行应用程序,然后导航到SplitView页面,然后离开,然后再次返回,您将遇到错误。
发布于 2018-01-26 05:25:22
问题出在SplitViewPageViewModel中。PanelPage属性返回一个Page。当您第一次导航到SplitViewPage时,它会正确地将其绑定到内容,但下次,您将把它绑定到一个新的可视化树。作为您创建的第一个SplitViewPage的子项,PanelPage仍然停留在内存中。这将抛出一个异常,因为该页面是另一个元素的子元素。
您需要避免在视图模型中包含任何UI元素。它们会卡在内存中。
如果你没有其他选择,你只是想让它正常工作,这里有一个变通方法:
public class SplitViewPageViewModel : ViewModelBase
{
private INavigationService _navigationService;
public SplitViewPageViewModel(INavigationService navService)
{
_navigationService = navService;
// construction removed here
}
private ICommand _OtherPageCommand;
public ICommand OtherPageCommand
{
get
{
return _OtherPageCommand ??
new RelayCommand(() =>
{
_PanelPage = null; // <-- Added this
_navigationService.Navigate(typeof(OtherPage));
});
}
}
private ICommand _HomePageCommand;
public ICommand HomePageCommand
{
get
{
return _HomePageCommand ??
new RelayCommand(() =>
{
_PanelPage = null; // <-- Added this
_navigationService.Navigate(typeof(HomePage));
});
}
}
private Page _PanelPage;
public Page PanelPage
{
get
{
// build page on demand
return _PanelPage ?? (_PanelPage = new Views.PanelPage());
}
set
{
_PanelPage = value;
RaisePropertyChanged("PanelPage");
}
}
}现在可以按需创建和处理面板页面。
https://stackoverflow.com/questions/48434741
复制相似问题