2017-04-25 1 views
0

Problème lié au fait que mon UIButton ne soit pas lié au ViewModel. Lorsque vous cliquez sur le bouton, la commande IMVXCommand du ViewModel n'est pas appelée. Le bouton apparaît mais ne reconnaît pas l'événement tactile. La chose vraiment étrange est que si je devais créer le LoginButton en utilisant l'Interface Builder, le code ci-dessous fonctionne.MVVMCross: UIButton non lié (par programme)

Voici un exemple de code:

[Register("LoginView")] 
public class LoginView : MvxView 
{ 
    UIBUtton loginButton; 

    public LoginView(IntPtr handler) : base(handler) 
    { 
    } 

    public LoginView(CGRect frame) : base(frame) 
    { 
     this.Frame = UIScreen.MainScreen.ApplicationFrame; 
     init(); 
    } 

    init() 
    { 
     CreateView(); 
    } 

    CreateView() 
    { 
     loginButton = new UIButton(new CoreGraphics.CGRect(0, 193, 300, 30)) 
     { 
      Font = UIFont.SystemFontOfSize(15, UIFontWeight.Medium), 
      TranslatesAutoresizingMaskIntoConstraints = false, 
      BackgroundColor = UIColor.Red, 
     }; 
     AddSubView(loginButton); 
     var set = this.CreateBindingSet<LoginView, LoginViewModel>(); 
     set.Bind(loginButton).To(vm => vm.ClickCommand); 
     set.Apply(); 
    } 
} 

ViewModel:

public class LoginViewModel : MvxViewModel 
{ 

    public AuthenticationViewModel() : base() 
    { 
    } 

     public IMvxCommand ClickCommand 
    { 
     get 
     { 
      return new MvxCommand(HandleClick); 
     } 
    } 

    public void HandleClick() 
    { 
     //This never gets called 
    } 
} 

Répondre

0

WOW, donc pas une blague 5 minutes après que j'ai posté ce que je réalise que j'avais oublié de régler la DataContext de la vue de le ViewModel. Littéralement, cette ligne de code résout le problème.

this.DataContext = new LoginViewModel(); 

Ajoutez que dans la méthode Init et tout est bien

Espérons que cela aide quelqu'un d'autre.

+0

Je pense que la bonne solution est de passer le Datacontext du conteneur MvxViewController à LoginView. De cette façon, les deux vues auront la même instance du LoginViewModel – Summon