我正在构建一个UWP应用程序。在我的一个页面上,我一直遇到标题中列出的异常。
这就是场景。该应用程序加载。我导航到我的Transit Page(引起问题的那个)并且它加载正常。然后我导航到另一个页面,但是当我尝试返回Transit页面时,我在App.g.i.cs文件中点击了那个未处理的异常。
异常中唯一的消息是:"参数不正确。\ r \ n"
我不知道造成这种情况的原因。如果我在后面的Transit代码中的OnNavigatedTo事件的代码中放了一个中断,它会加载ViewModel,然后我就点击了错误:
public ICommand TransitButtonCommand
{
get
{
return _TransitButtonCommand ??
new RelayCommand(() =>
{
_navigationService.Navigate(typeof(TransitView));
});
}
}
解决这个问题的唯一方法是:NavigationCacheMode ="必需"在Transit视图XAML文件中,但这不是最佳的,因为此页面显示了列车/公交时刻表,我需要在每次加载时对其进行更新。
任何人都有任何想法为什么会这样?我很高兴再从项目中提供代码来帮助解决这个问题。
My Transit页面包含一个SplitView,我根据选择的菜单项将另一个XAML页面加载到其中。
我创建了一个小项目并将其放在GitHub上以演示此错误,您可以在此处找到它: https://github.com/marekt77/SplitViewBindingTest
运行应用程序,然后导航到SplitView页面,然后离开,然后再返回,然后您将遇到错误。
答案 0 :(得分:1)
问题出在SplitViewPageViewModel
。 PanelPage
属性返回Page
。当您第一次导航到SplitViewPage
时,它会将其正确绑定到内容,但是下次,您将其绑定到新的可视树。 PanelPage
仍然作为您创建的第一个SplitViewPage
的子项卡在内存中。这将引发异常,因为该页面是另一个元素的子元素。
您需要避免在视图模型中使用任何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");
}
}
}
现在可以按需创建和处理面板页面。