J'essaye de mettre en place une liaison sur un bouton qui navigue vers un nouveau modèle de vue quand on clique sur le bouton.Pourquoi une liaison à un autre ViewModel n'ouvre-t-elle pas la vue correspondante?
Voici mon ViewModel:
public class NotificationsViewModel : BaseViewModel
{
public NotificationsViewModel(IMvxNavigationService navigation)
: base(navigation)
{
}
public void GoToNextPage()
{
_navigation.Navigate<AboutMeViewModel>();
}
public MvxCommand GoToNextPageCommand
{
get { return new MvxCommand(async() => await _navigation.Navigate<AboutMeViewModel>()); }
}
}
Voici le constructeur pour les BaseViewModel qu'il hérite de (je ne pense pas que le reste de BaseViewModel est pertinente, mais laissez-moi savoir s'il pourrait être utile de voir):
public abstract class BaseViewModel : MvxViewModel, IBaseViewModel
{
protected readonly IMvxNavigationService _navigation;
public BaseViewModel(IMvxNavigationService navigation)
{
_navigation = navigation;
}
}
Voici la vue où je crée la liaison à ce ViewModel:
public partial class NotificationsView : BaseView<NotificationsViewModel>
{
public NotificationsView() : base("NotificationsView", null)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
var set = this.CreateBindingSet<NotificationsView, NotificationsViewModel>();
set.Bind(NextPageButton.Tap()).For(tap => tap.Command).To(nameof(ViewModel.GoToNextPage));
set.Bind(NextPageCommandButton).To(nameof(ViewModel.GoToNextPageCommand));
set.Apply();
}
public override void DidReceiveMemoryWarning()
{
base.DidReceiveMemoryWarning();
// Release any cached data, images, etc that aren't in use.
}
}
[Register ("NotificationsView")]
partial class NotificationsView
{
[Outlet]
[GeneratedCode ("iOS Designer", "1.0")]
UIKit.UIButton NextPageButton { get; set; }
void ReleaseDesignerOutlets()
{
if (NextPageButton != null) {
NextPageButton.Dispose();
NextPageButton = null;
}
}
}
Voici le BaseView hérite de:
public abstract class BaseView<T> : MvxViewController<T>, IBaseView
where T : BaseViewModel
{
private object _headerToken = null;
private object _addTaskToken = null;
private UIView _originalView = null;
public BaseView(string name, NSBundle bundle)
: base(name, bundle)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
if (ViewModel == null)
return;
_headerToken = ViewModel.WeakSubscribe(() => ViewModel.IsLogoVisible, OnHeaderEnabledChanged);
_addTaskToken = ViewModel.WeakSubscribe(() => ViewModel.IsAddTaskVisible, OnAddTaskEnabledChanged);
ViewModel.Start();
}
}
Quand je déboguer ce code dans l'émulateur, je peux mettre un point d'arrêt à l'intérieur de la GoToNextPage
qui est touché, donc je sais que la liaison est attraper l'événement click. Toutefois, lorsque je continue l'exécution, la navigation vers le nouveau modèle de vue ne se produit pas, mais aucune exception n'est levée.
Je suis en mesure de naviguer à ce modèle de vue sans problème d'une autre page, donc je pense que quelque chose doit être mal avec la façon dont je mis en place cette liaison. Autant que je sache, cette reliure est exactement la même que celle que j'ai. Qu'est-ce que j'oublie ici?
pouvez-vous publier la définition BaseView s'il vous plaît? – CodexNZ
Yup, définition BaseView et autre classe partielle pour NotificationsView ont été ajoutés – DanHam
Vous devez lier à un 'Command'. Plus spécifique un 'IMvxAsyncCommand'. Puisque vous n'utilisez pas une tâche asynchrone pour naviguer vos exceptions seront avalées. – Martijn00