2017-02-24 1 views
1

j'ai un MvxRecyclerView qui a le fichier AXML suivant:Comment câbler les actions de MvxRecyclerView article à ViewModel

<?xml version="1.0" encoding="utf-8"?> 
<MvvmCross.Droid.Support.V7.RecyclerView.MvxRecyclerView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:MvxItemTemplate="@layout/item_detail" 
    app:MvxBind="ItemsSource Items" /> 

Correspodning ViewModel est défini comme ceci:

public class ItemsViewModel : MvxViewModel 
{ 
    private ObservableCollection<Models.Item> _items; 

    public ObservableCollection<Models.Item> Items 
    { 
     get { return _items; } 
     set 
     { 
      _items = value; 
      RaisePropertyChanged(() => Items); 
     } 
    } 

    public MvxCommand CommandToBeInvokedFromItem 
    { 
     get 
     { 
      return new MvxCommand(async() => 
      { 
       await ...; 
      }); 
     } 
    } 
    ... 
} 

Mon item_detail AXML est défini comme ceci:

<?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:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"   
    android:textSize="24dp" 
    local:MvxBind="Text Name" /> 

    <ImageButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/ic_delete_forever_black_24dp" 
    local:MvxBind="Click CommandToBeInvokedFromItem"/> 

</LinearLayout> 

Et Model.Item est défini comme ceci:

public class Item 
{ 
    public string Name { get; set; } 
} 

Première TextView se lie à la propriété de nom d'élément qui fonctionne très bien. Mais je veux que ImageButton se lie à une commande sur le ViewModel à laquelle MvxRecylerView est lié plutôt qu'à une propriété de l'Item. L'élément est juste un modèle et non un ViewModel. Comment puis-je accomplir cela?

Répondre

0

Si vous souhaitez que la commande soit appelée au clic d'un élément dans le MvxRecycler (c'est-à-dire la cellule entière), la liaison est relativement simple. Il suffit de changer la valeur de MvxBind sur le MvxRecyclerView de ItemsSource Items à ItemsSource Items; ItemClick CommandToBeInvokedFromItem. CommandToBeInvokedFromItem aurait alors besoin d'être modifié pour accepter Item comme un paramètre de type, qui ressemblerait à ceci:

public MvxCommand<Models.Item> CommandToBeInvokedFromItem 
{ 
    get 
    { 
     return new MvxCommand<Models.Item>(async() => 
     { 
      await ...; 
     }); 
    } 
} 

Si la commande doit être évoqué de manière spécifique en cliquant sur le ImageButton, la méthode la plus simple serait de se déplacer CommandToBeInvokedFromItem à Item, et d'avoir élément hériter MvxViewModel, ou au moins mettre en œuvre INotifyPropertyChanged.

+0

Luke, merci mais c'est le deuxième comportement que je désire. Je veux câbler une commande à un clic sur le ImageButton qui se trouve dans la "cellule" MvxRecyclerView. Et oui, je me demandais si je pouvais le faire sans avoir d'élément à hériter de MvxViewModel. – Igor

+0

Cela devrait fonctionner correctement sans hériter de 'MvxViewModel'. Il suffit de déplacer 'CommandToBeInvokedFromItem' à' Item'. –

0

Passez la commande au Item lorsque vous le créez dans votre ItemsViewModel.

public class Item 
{ 
    public string Name { get; set; }   
    public MvxCommand CommandToBeInvokedFromItem {get;} 

    public Item(MvxCommand clickCommand) 
    { 
     CommandToBeInvokedFromItem = clickCommand; 
    } 
}