2012-05-08 14 views
5

Estoy desarrollando una aplicación multiplataforma comenzando en Android. He encontrado tu proyecto de MVVMCross y estoy intentando entrar en él. Ahora mismo soy totalmente nuevo y no sé cómo vincular mis resultados de WebService a mi ListView. Aquí un poco de XAML como ejemplo la forma en que estoy tratando de que:Enlaces de MVVMCross en 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'}}" /> 
... 

se ve exactamente como esta

<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'}}" /> 

Cuando estoy flotando las dos últimas líneas de la descripción dice atributo no se declara. Realmente no sé cómo haces esto. ¿Me puedes dar algún consejo? Creo que tengo que escribir algunos xml en el proyecto de valores de mi IU, ¿verdad?

Otra pregunta: ¿Cómo podría usar AutoCompleteTextViews? ¿Tengo que escribir mis propios MvXBindables primero para eso? ¿Algún consejo? :-)

+0

Por favor, haga una pregunta por pregunta - esto ayuda a buscando problemas y respuestas para otros. – Stuart

+1

He dividido las preguntas. la nueva parte está ahora allí http://stackoverflow.com/questions/10511853/constructor-in-viewmodel – Martin

Respuesta

5

Para obtener estos atributos para vincular, debe incluir el espacio de nombres, que parece que ha hecho.

También es necesario incluir el archivo MvxBindingAttributes.xml en su proyecto de interfaz de usuario - https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Binding/ResourcesToCopy/MvxBindingAttributes.xml - y debe establecer la acción de construcción de este archivo a "AndroidResource"

Para un ejemplo, ver a ninguno de los proyectos de la muestra Android - https://github.com/slodge/MvvmCross


para la segunda parte de su pregunta acerca de los enlaces de la adición, el marco vinculante debe enlazar automáticamente unidireccional (de modelo de vista para ver) a las propiedades públicas existentes en cualquier Monodroid Ver/widgets.

Si la propiedad pública no es del tipo correcto (por ejemplo, es una enumeración de Android en lugar de una vista), puede utilizar un IMvxValueConverter para realizar la conversión.

Si desea hacer un enlace bidireccional, o no hay una propiedad pública para lo que desea vincular, entonces puede realizar un enlace personalizado con bastante facilidad. Para ver un ejemplo de esto, consulte el enlace personalizado de 2 vías de IsFavorite en the conference sample

Este código agrega una nueva pseudoinserta encuadernada "IsFavorite" a cada botón de Android.

... esto es inicializado en Setup.cs utilizando código como:

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))); 
    } 

... y el código de enlace es:

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

¡Gracias por esta respuesta! ¡me ayudaste mucho! – Martin

+0

Genial - más pregunte aquí o en http://jabbr.net/#/rooms/mvvmcross :) – Stuart

Cuestiones relacionadas