2014-10-09 5 views
1

Я просмотрел "Down at Android Fragments" и образцы, и они показывают использование одного фрагмента в представлении. В этом окне вы Найти фрагмент и установить его ViewModelНастройка ViewModel на фрагменте, используемом в MvxItemTemplate

Мы делаем это в нескольких местах, например, так

// Expand the patient banner 
var myFragment = (MyFragment)SupportFragmentManager.FindFragmentById(Resource.Id.banner); 
this.vm = (MyViewModel)this.ViewModel; 
myFragment.ViewModel = this.vm; 

Это нормально. То, что я не знаю, как это сделать, - установить ViewModel на фрагменте, когда этот фрагмент используется в MvxItemTemplate List.

Например, связанный MvxListView, который имеет MvxItemTemplate установить на этот axml файл

<?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="wrap_content" 
    local:MvxBind="Click ClickCommand"> 
    <fragment 
     class="MyComp.MyDept.Droid.Views.ItemFragment" 
     android:id="@+id/ItemFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

Как установить правильный пункт ViewModel для фрагмента в каждом из элементов в ListView в?

+0

Вы решили эту проблему? Каково было решение? – angusf

+0

К сожалению, не –

+0

Спасибо за ответ – angusf

ответ

0

Простейшим способом было бы сделать это в вашем адаптере. Когда список, содержащий элементы, вызывает GetBindableView, у вас будет доступ к dataContext и templateId, который породил создание ячейки в первую очередь, поэтому вы можете соответственно установить их там, вытащив фрагмент непосредственно из представления с помощью простой FindFragmentById.

Так, что-то примерно так, как это должно делать хорошо для вас:

protected override View GetBindableView (View convertView, object dataContext, int templateId) 
    { 
     var view = base.GetBindableView (convertView, dataContext, templateId);   
     var frag = (this.Context as Activity).FragmentManager.FindFragmentById<MvxFragment>(<YourDroidNamespace>.Resource.Id.ItemFragment); // Better to pass in a fragment manager instance in the constructor 
     frag.DataContext = dataContext; 
     return view; 
    } 

Во-первых, получить представление, где фрагмент. Во-вторых, получите менеджер фрагментов и найдите FindFragmentById, чтобы найти ваш конкретный фрагмент в представлении. Наконец, установите DataContext и верните его.

Смежные вопросы