我不确定我是在问正确的问题还是以错误的方式解决这个问题,但我正在使用 GridApp 项目模板开发一个 Windows 8 应用程序。
在 itemdetail 模板中,我可以删除您正在查看的项目。删除它后,我导航回应用程序的主入口页面。
但是,后退按钮在那里,如果我单击它,它会尝试返回到已删除对象的那个框架。
我该如何避免这种情况?
我不确定我是在问正确的问题还是以错误的方式解决这个问题,但我正在使用 GridApp 项目模板开发一个 Windows 8 应用程序。
在 itemdetail 模板中,我可以删除您正在查看的项目。删除它后,我导航回应用程序的主入口页面。
但是,后退按钮在那里,如果我单击它,它会尝试返回到已删除对象的那个框架。
我该如何避免这种情况?
在您的删除功能中,您可以调用GoBack()
以便在删除后页面自动导航到主页。
后退按钮也应该有以下代码
IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}"
哪个启用和禁用后退按钮取决于是否有要返回的页面。
如您所说GoHome()
,这是解决此问题的最佳方法。
这是删除所有返回导航。
if (this.Frame != null) { while (this.Frame.CanGoBack) this.Frame.GoBack(); }
最简单的方法是使用与按钮关联的内置命令机制:
xml:
视图模型:
public ViewModel()
{
_goBackCommand=new DelegateCommand(GoBackMethod,CanGoBackMethod);
}
public ICommand GoBackCommand
{
get{return _goBackCommand;}
}
private void GoBackMethod()
{
Frame.Navigate(blah);
}
private bool CanGoBackMethod()
{
return _isDeleted;
}
public void Delete()
{
_isDeleted=false;
//this forces the command to re-evaluate whether it can execute
_goBackCommand.RaiseCanExecuteChanged();
}
即使您不使用 MVVM 并且仅使用代码隐藏,您仍然可以将命令绑定到您的按钮对象并对其执行完全相同的操作。如果您需要创建一个具有 RaiseCanExecuteChanged 功能的命令,那么您可以使用它:
public class DelegateCommand : ICommand
{
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;
public event EventHandler CanExecuteChanged;
public DelegateCommand(Action<object> execute)
: this(execute, null)
{
}
public DelegateCommand(Action<object> execute,
Predicate<object> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}
public override bool CanExecute(object parameter)
{
if (_canExecute == null)
{
return true;
}
return _canExecute(parameter);
}
public override void Execute(object parameter)
{
_execute(parameter);
}
public void RaiseCanExecuteChanged()
{
if( CanExecuteChanged != null )
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
如果您使用的是 Prism 或 MvvmLight,那么他们自己的命令开箱即用地实现了这一点。