0

我不确定我是在问正确的问题还是以错误的方式解决这个问题,但我正在使用 GridApp 项目模板开发一个 Windows 8 应用程序。

在 itemdetail 模板中,我可以删除您正在查看的项目。删除它后,我导航回应用程序的主入口页面。

但是,后退按钮在那里,如果我单击它,它会尝试返回到已删除对象的那个框架。

我该如何避免这种情况?

4

3 回答 3

1

在您的删除功能中,您可以调用GoBack()以便在删除后页面自动导航到主页。

后退按钮也应该有以下代码

IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}"

哪个启用和禁用后退按钮取决于是否有要返回的页面。

如您所说GoHome(),这是解决此问题的最佳方法。

Windows 8/RT 中页面导航的更多细节

于 2012-10-23T01:52:02.183 回答
0

这是删除所有返回导航。

if (this.Frame != null) { while (this.Frame.CanGoBack) this.Frame.GoBack(); }

于 2013-07-18T08:39:01.413 回答
0

最简单的方法是使用与按钮关联的内置命令机制:

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,那么他们自己的命令开箱即用地实现了这一点。

于 2012-10-23T08:42:02.030 回答