正しい質問をしているのか、間違った方法で行っているのかはわかりませんが、GridAppプロジェクトテンプレートを使用してWindows8アプリを開発しています。
itemdetailテンプレートでは、表示しているアイテムを削除することができます。削除した後、アプリのメインエントリページに戻ります。
ただし、戻るボタンはそこにあり、クリックすると、削除されたオブジェクトのそのフレームに戻ろうとします。
どうすればこれを回避できますか?
正しい質問をしているのか、間違った方法で行っているのかはわかりませんが、GridAppプロジェクトテンプレートを使用してWindows8アプリを開発しています。
itemdetailテンプレートでは、表示しているアイテムを削除することができます。削除した後、アプリのメインエントリページに戻ります。
ただし、戻るボタンはそこにあり、クリックすると、削除されたオブジェクトのそのフレームに戻ろうとします。
どうすればこれを回避できますか?
GoBack()
削除機能では、削除直後にページが自動的にメイン ページに移動するように呼び出すことができます。
また、戻るボタンには次のコードが必要です
IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}"
戻るページがあるかどうかに応じて、戻るボタンを有効または無効にします。
あなたが言っGoHome()
たように、この問題に対する最良の解決策です。
これを行う最も簡単な方法は、ボタンに関連付けられた組み込みのCommandingメカニズムを使用することです。
Xaml:
viewModel:
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を使用している場合は、独自のコマンドでこれをすぐに実装できます。
これはすべての戻るナビゲーションを削除します。
if (this.Frame != null) { while (this.Frame.CanGoBack) this.Frame.GoBack(); }