/// <summary> /// Returns true if parameter has a value that can lead to a holder. /// </summary> /// <param name="parameter"> /// Could be a container id (<c>string</c>), container (<see cref="ItemsControl"/>), or holder (<see cref="ContentControl"/>). /// </param> /// <returns></returns> public bool CanExecute(object parameter) { try { var holder = MvxCloseViewCommand.GetHolder(parameter); if (holder == null) { return(true); } return(!MvxContainer.GetHasClosingAction(holder)); } catch (Exception) { } return(true); }
/// <summary> /// Execute a close command on a holder. /// </summary> /// <param name="parameter"> /// Could be a container id (<c>string</c>), container (<see cref="ItemsControl"/>), or holder (<see cref="ContentControl"/>). /// </param> /// <remarks> /// If the parameter is <see cref="string"/>, the command will search for the container of same id /// and if the parameter is <see cref="ItemsControl"/> it will use it as a container. /// In both cases the command will get the selected holder in the container (if it is a <see cref="Selector"/>) /// or it will use the last holder in the items collection. /// The close command is will close all the views in the holder navigation stack. /// </remarks> public async void Execute(object parameter) { var holder = MvxCloseViewCommand.GetHolder(parameter); if (holder == null) { throw new InvalidCastException("Command parameter should be a content control."); } var history = MvxContainer.GetHolderHistory(holder); if (history != null) { MvxContainer.SetHasClosingAction(holder, true); RaiseCanExecuteChanged(); var nav = Mvx.Resolve <IMvxNavigationService>(); foreach (var mv in history.Select((c) => MvxWpfPresenter.GetViewModel(c)).ToList()) { await nav.Close(mv); } MvxContainer.SetHasClosingAction(holder, false); RaiseCanExecuteChanged(); } }