2012-05-08 14 views
5

Sto sviluppando un'applicazione multipiattaforma avviandolo in Android. Ho trovato il tuo progetto MVVMCross e sto cercando di approfondirlo. In questo momento sono totalmente nuovo e non so come legare i miei risultati WebService al mio ListView. Ecco un po 'di XAML come esempio di come sto cercando è:MVVMCross Bindings in Android

xmlns:mobsales="http://schemas.android.com/apk/res/MobSales.DroidUI" 
... 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_marginLeft="5dp" 
mobsales:MvxItemTemplate="@layout/listitem_customer" 
mobsales:MvxBind="{'ItemSource':{'Path':'Customer'}}" /> 
... 

appare esattamente come questo

<cirrious.mvvmcross.binding.android.views.MvxBindableListView 
     android:id="@+id/autocomplete" 
     android:layout_below="@id/txtfield" 
     android:layout_centerHorizontal="true" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     mobsales:MvxItemTemplate="@layout/listitem_customer" 
     mobsales:MvxBind="{'ItemSource':{'Path':'Customers'}}" /> 

Quando sto in bilico le ultime due righe del tooltip dice attributo non è dichiarato. Non so davvero come lo fai. Puoi darmi qualche consiglio? Penso di dover scrivere qualche xml nei valori del mio progetto UI, giusto?

Un'altra domanda: come utilizzare AutoCompleteTextViews? Devo scrivere prima i miei MvXBindables? Qualche consiglio? :-)

+0

chiedono Si prega di una domanda per ogni domanda - questo aiuta con alla ricerca di problemi e risposte per gli altri. – Stuart

+1

Ho diviso le domande. la nuova parte è ora laggiù http://stackoverflow.com/questions/10511853/constructor-in-viewmodel – Martin

risposta

5

Per ottenere il binding di questi attributi è necessario includere lo spazio dei nomi, che sembra averlo fatto.

È inoltre necessario includere il file MvxBindingAttributes.xml nel progetto UI - https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Binding/ResourcesToCopy/MvxBindingAttributes.xml - ed è necessario impostare l'azione di costruzione di questo file "AndroidResource"

Per un esempio, vedere uno dei progetti di esempio Android - https://github.com/slodge/MvvmCross


per la seconda parte della sua domanda su attacchi aggiunta, il quadro vincolante dovrebbe automaticamente a senso unico bind (da ViewModel per vedere) a proprietà pubbliche esistenti su qualsiasi MonoDroid View/widget di.

Se la proprietà pubblica non è del tipo corretto (ad esempio è un'enumerazione di Android anziché una vista), è possibile utilizzare un IMvxValueConverter per eseguire la conversione.

Se si desidera eseguire il binding a 2 vie o non esiste una proprietà pubblica per ciò a cui si desidera associare, è possibile eseguire facilmente un'associazione personalizzata. Per un esempio di questo, vedere la legatura personalizzata IsFavorite 2 in the conference sample

Questo codice aggiunge una nuova pindondabile proprietà "IsFavorite" a ogni pulsante Android.

... questo viene inizializzato in Setup.cs utilizzando il codice come:

protected override void FillTargetFactories(MvvmCross.Binding.Interfaces.Bindings.Target.Construction.IMvxTargetBindingFactoryRegistry registry) 
    { 
     base.FillTargetFactories(registry); 

     registry.RegisterFactory(
        new MvxCustomBindingFactory<Button>(
         "IsFavorite", 
         (button) => new FavoritesButtonBinding(button))); 
    } 

... e il codice vincolante è:

public class FavoritesButtonBinding 
    : MvxBaseAndroidTargetBinding 
{ 
    private readonly Button _button; 
    private bool _currentValue; 

    public FavoritesButtonBinding(Button button) 
    { 
     _button = button; 
     _button.Click += ButtonOnClick; 
    } 

    private void ButtonOnClick(object sender, EventArgs eventArgs) 
    { 
     _currentValue = !_currentValue; 
     SetButtonBackground(); 
     FireValueChanged(_currentValue); 
    } 

    public override void SetValue(object value) 
    { 
     var boolValue = (bool)value; 
     _currentValue = boolValue; 
     SetButtonBackground(); 
    } 

    private void SetButtonBackground() 
    { 
     if (_currentValue) 
     { 
      _button.SetBackgroundResource(Resource.Drawable.star_gold_selector); 
     } 
     else 
     { 
      _button.SetBackgroundResource(Resource.Drawable.star_grey_selector); 
     } 
    } 

    protected override void Dispose(bool isDisposing) 
    { 
     if (isDisposing) 
     { 
      _button.Click -= ButtonOnClick; 
     } 
     base.Dispose(isDisposing); 
    } 

    public override Type TargetType 
    { 
     get { return typeof(bool); } 
    } 

    public override MvxBindingMode DefaultMode 
    { 
     get { return MvxBindingMode.TwoWay; } 
    } 
} 
+0

Grazie per questa risposta! Mi hai aiutato molto! – Martin

+0

Fresco - chiedi di più qui o su http://jabbr.net/#/rooms/mvvmcross :) – Stuart

Problemi correlati