我不确定我是在问正确的问题还是以错误的方式解决这个问题,但我正在使用GridApp项目模板开发Windows 8应用程序。
在itemdetail模板中,我可以删除您正在查看的项目。删除后,我会导航回应用程序的主要输入页面。
然而,后退按钮就在那里,如果我点击它,它会尝试返回到那个被删除对象的帧。
我该如何避免这种情况?
答案 0 :(得分:1)
在删除功能中,您可以拨打GoBack()
,以便在删除后页面自动导航到主页面。
此外,后退按钮应具有以下代码
IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}"
启用和禁用后退按钮,具体取决于是否有要返回的页面。
正如您所说GoHome()
是解决此问题的最佳方法。
答案 1 :(得分:0)
最简单的方法是使用与按钮关联的内置命令机制:
的Xaml:
视图模型:
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,那么他们自己的命令就可以实现这一点。
答案 2 :(得分:0)
这是删除所有后退导航。
if(this.Frame!= null) { while(this.Frame.CanGoBack)this.Frame.GoBack(); }