2017-06-20 1 views
-1

Dans mon viewmodelA, j'ai une propriété que lorsque le bouton de mon fragmentA.axml est cliqué, je fais Mvxbind et l'écran change et il montre viewmodelB et aussi j'envoie une requête http et je suis obtenir une réponse comme prévu. Cela fonctionne exactement comme je le veux. Mais le problème est que je peux sembler montrer cette réponse dans ma page fragmentB.axml (someNumber et status). Quelqu'un peut-il m'aider avec ce problème. Merci!!MvvmCross - MvxBind pas lier correctement

ViewmodelA.cs:

public MvxCommand SomeCommand 
    { 
     get 
     { 
      return new MvxCommand(() => something()); 
     } 
    } 
    public async void something() 
    { 
     ShowViewModel<ViewModelB>(); 

     SomeService serviceWrapper = new SomeService(); 
     var model = {//Some Json request}; 
     var result = await serviceWrapper.SubmitRequestAsync(model); 
     SomeResponse response = StaticMethods.DeserializeJson<SomeResponse>(result); 

     Status = response.SomeResponse1.Activity[0].Status.Description; 
     SomeNumber = response.SomeResponse1.SomeNumber; 

     Debug.WriteLine("SomeNumber : " + SomeNumber); 
     Debug.WriteLine("Status: " + Status); 

    } 

    private string _someNumber; 
    public string SomeNumber 
    { 
     get 
     { 
      return _someNumber; 
     } 

     set 
     { 
      SetProperty(ref _someNumber, value); 
      RaisePropertyChanged(() => SomeNumber); 
     } 
    } 

    private string _status; 
    public string Status 
    { 
     get 
     { 
      return _status; 
     } 

     set 
     { 
      SetProperty(ref _status, value); 
      RaisePropertyChanged(() => Status); 
     } 
    } 

fragmentA.axml

<Button 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Submit" 
    android:id="@+id/Submit" 
    local:MvxBind="Click SomeCommand" /> 

fragmentB.axml

<TextView 
    android:text="Some Number:" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/SomeNum" 
    local:MvxBind="Text SomeNumber "/> 
<TextView 
    android:text="Status:" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/status" 
    local:MvxBind="Text Status"/> 
+0

Votre classe a-t-elle défini: INotifyPropertyChanged? Vous n'avez pas fourni de définition de classe –

+1

Je suis un peu confus.Il semble que vous essayez d'accéder à ViewModelB, mais les propriétés que vous souhaitez afficher dans votre vue sont dans ViewModelA? – Ulbo

+0

@Ulbo Je vois ce que vous dites mais je veux envoyer la requête http, quand je clique sur le bouton. Mais mon problème est que je ne sais pas comment afficher ces données dans un autre fragment de viewmodel (c'est-à-dire fragmentB). Si vous savez comment je peux aborder ce problème, s'il vous plaît faites le moi savoir. Merci –

Répondre

0

Pour autant que je peux vous voir partir t deux options:

La première option consiste à attendre pour vous envoyer un appel HTTP jusqu'à ce que vous soyez dans ViewModelB, et charger les données là-bas.

La deuxième option consiste à attendre que votre appel HTTP soit terminé avant de naviguer et à envoyer les données récupérées dans ViewModelA en tant que paramètre de navigation pour ViewModelB.

+0

Pour la deuxième option, comment puis-je envoyer les données dans ViewModelA. Pouvez-vous donner un exemple? –

+1

Stuart a donné une bonne réponse sur la façon de passer des paramètres entre viewmodels. Vous devriez aller voir ici: https://stackoverflow.com/questions/19058173/passing-complex-navigation-parameters-with-mvvmcross-showviewmodel – Ulbo

+1

Voir la documentation officielle sur les paramètres de passage: https: //www.mvvmcross .com/documentation/fondamentaux/navigation – Martijn00

1

MvvmCross ne fait pas un ViewModel à n vues. Seules les relations 1: 1 sont autorisées.

Il existe plusieurs façons de résoudre votre problème.

1. Transmettez un objet dans ShowViewModel ou le nouveau NavigationService qui décrit votre résultat depuis ICommand. Pour que cela fonctionne, vous devez attendre la navigation jusqu'à ce que votre demande est faite:

var result = await GetSomeData(); 
ShowViewModel<ViewModelB>(new { status = Status, number = SomeNumber }); 

Puis, en ViewModelB:

public void Init(string status, string number) 
{ 
    Status = status; 
    Number = number; 
} 

ensuite avoir des accessoires pour le statut et le numéro dans ce ViewModel.

2. avons un service que vous partagez entre vos ViewModels et l'ont garder l'état et prendre soin de votre repos appels:

public class MyService : IMyService 
{ 
    public string Status {get; set;} 
    public string Number {get; set;} 

    public async Task DoStuff() 
    { 
    } 
} 

Puis, en ViewModelA cteur serait:

public ViewModelA(IMyService service) 

dans votre commande:

public async void something() 
{ 
    await _service.DoSomething(); 
    ShowViewModel<ViewModelB>(); 
} 

Ctor dans ViewModelB serait similaire à ViewModelA et remplir juste ce que les accessoires ou les accessoires ont reflètent directement ce qui est en service comme:

public string Status => _service.Status; 

Ce ne sont que deux façons de résoudre ce problème.