2017-09-19 6 views
0

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?

+0

pouvez-vous publier la définition BaseView s'il vous plaît? – CodexNZ

+0

Yup, définition BaseView et autre classe partielle pour NotificationsView ont été ajoutés – DanHam

+0

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

Répondre

0

Il vous manque un attribut pour l'enregistrement de la vue et une pour la cartographie de la vue du modèle de vue?

[Register("NotificationsView")] // this is missing... 
[MvxViewFor(typeof(NotificationsViewModel))] // this is missing... 
public partial class NotificationsView : BaseView<NotificationsViewModel> 
{ 
    public NotificationsView() : base("NotificationsView", null) 
    { 
    } 
} 
+0

Merci pour la réponse. L'attribut d'enregistrement de la vue se trouve sur la classe partielle dans le fichier NotificationsView.designer.cs généré dans le cadre de la vue. J'ai cherché dans mon projet l'attribut 'MvxViewFor' mappant la vue au modèle de vue et je ne le trouve nulle part, donc je ne pense pas que ce soit la différence dans mon cas. Je vais essayer et vous dire ce que je trouve. – DanHam

+0

Confirmé, l'ajout de l'attribut 'MvxViewFor' n'a pas changé le comportement pour moi. Basé sur [ce message] (https://github.com/MvvmCross/MvvmCross/issues/195), il me semble qu'il existe plusieurs façons de lier des vues pour afficher des modèles dans MvvmCross. – DanHam