2015-03-01 1 views
0

J'ai écrit une application Windows Store que je dois porter sur Android. J'essaie d'utiliser MvvmCross et Xamarin dans Visual Studio pour y parvenir. Dans mon application Windows, je créer un écran en utilisant XAML et dans la zone de texte, etc., définir la liaison au champ dans mon objet datamodel. J'obtiendrais mes objets datamodel d'une référence de service de WCF. Dans le code derrière pour l'écran, je voudrais simplement définir le datacontext de la grille de mise en page racine à l'objet datamodel généré par la référence de service. C'était plutôt simple.MvvmCross Relier votre DataModel à votre ViewModel

Dans MvvmCross, il semble que vous exécutiez fondamentalement le viewmodel pour charger une page. La syntaxe des champs du viewmodel est vraiment identique à ceux générés dans le datamodel par la référence du service. Je sais que Mvvm a besoin du viewmodel en tant que shim entre le datamodel et la vue. Existe-t-il un moyen efficace de passer les propriétés du modèle de données, à travers le viewmodel à la vue? J'ai la référence de service fonctionnant et générant des objets et des données de la WCF. Je pourrais coder en dur chaque champ qui existe dans le modèle de données dans le viewmodel et avoir l'action get set sur les champs de l'objet datamodel. J'espérais juste qu'il y avait une façon moins manuelle de le faire. Aucune suggestion?

+1

Vous pouvez utiliser quelque chose comme 'AutoMapper' pour déplacer les propriétés. Ou vous pouvez exposer votre classe WCF DTO comme une propriété sur le ViewModel - par exemple. voir comment le Session DTO a été utilisé dans https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.UI.Droid/Resources/Layout/Page_Session.axml#L55 – Stuart

+0

Merci beaucoup Stuart. J'ai utilisé ton plan B. J'ai travaillé comme un charme une fois que j'ai compris les nuances. [Activity (Label = "Voir pour ShipmentViewModel")] est très important hehe. –

+0

Stuart, comment marquer votre commentaire comme réponse? –

Répondre

1

@Stuart avait une excellente suggestion. Voici ce que j'ai fait. Voici mon ViewModel:

public class InventoryViewModel 
    : MvxViewModel 
{ 
    public async void Init(Guid ID) 
    { 
     await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipmentInventory(ID); 
     ShipmentInventory = ShipmentDataSource.CurrInventory; 

     Shipment = await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipment((int)ShipmentInventory.idno, (short)ShipmentInventory.idsub); 
    } 

    private Shipment _Shipment; 
    public Shipment Shipment 
    { 
     get { return _Shipment; } 
     set { _Shipment = value; RaisePropertyChanged(() => Shipment); } 
    } 

    private ShipmentInventory _ShipmentInventory; 
    public ShipmentInventory ShipmentInventory 
    { 
     get { return _ShipmentInventory; } 
     set { _ShipmentInventory = value; RaisePropertyChanged(() => ShipmentInventory); } 
    } 
} 

Je passe un ID Guid et dans la méthode Init, il obtient l'inventaire des expéditions et l'expédition associé. Quand je lie les champs, je me lie à l'envoi. comme suit:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
     <EditText 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      style="@style/InputEditText" 
      local:MvxBind="Text Shipment.OrgEmail" /> 
</LinearLayout> 

C'est tout ce qu'il y avait à faire!

Espérons que cela aide quelqu'un.

Jim