3

У меня есть ViewModel и DialogFragment для просмотра этой виртуальной машины. В ядре я показываю VM таким образомBinding MvxDialogFragment with ViewModel

this.ShowViewModel<AnnotationEditViewModel>(); 

у меня есть этот код в AnnotationEditDialogFragment.cs

[Register("AnnotationEditDialogFragment")] 
public class AnnotationEditDialogFragment : MvxDialogFragment<AnnotationEditViewModel> 
{ 
... 
public override Dialog OnCreateDialog(Bundle savedInstanceState) 
{ 
base.EnsureBindingContextSet(savedInstanceState); 
var view = this.BindingInflate(Resource.Layout.text_annotation_dialog_fragment, null); 
var titleAnnotationTextView = view.FindViewById<TextViewWithFont>(Resource.Id.titleAnnotationTextView); 
var set = this.CreateBindingSet<AnnotationEditFragment, AnnotationEditViewModel>(); 
set.Bind(this).For(be => be.CanBeSaved).To(vm => vm.CanBeSaved); 
set.Apply(); 
builder = new AlertDialog.Builder(Activity); 
LayoutInflater inflater = Activity.LayoutInflater; 
builder.SetView(view); 
alertDialog = builder.Create(); 
return alertDialog; 
} 
... 
} 

У меня есть запрос в MainPresenter в методе Showv, где я могу обнаружить этот запрос.

если в MainPresenter я печатаю этот код:

var textAnnotationDialogFragment = Activity.FragmentManager.FindFragmentByTag(nameof(AnnotationEditFragment)) as AnnotationEditFragment ?? new AnnotationEditFragment(); 
textAnnotationDialogFragment.Show(Activity.FragmentManager, nameof(AnnotationEditFragment)); 
  • Я вижу диалог, но я не связываясь с VM/

если я печатаю этот код для ShowViewModel() :

base.Show(request, fragmentRequest); 
  • я получаю ошибку, не было обнаружено какой-либо активности или фрагмента для моего VM/ Как мне установить диалог с привязкой к виртуальной машине?

ответ

3

Вопросы:

1. Ведущий обрабатывались Запрос подход - ViewModel Null

Используя этот подход ViewModel свойство AnnotationEditFragment является недействительным, как не ViewModel не был установлен на фрагменте как он создается вне обычного жизненного цикла Mvx использует при создании нормального MvxFragments. MvxDialogFragment следуйте другому жизненному циклу.

2. Выступающий Unhandled Request подход - Нет активности

Используя этот подход стандартный фрагмент жизненного цикла MVX пытается быть выполнен на MvxDialogFragment. Для этого требуется указать действие для размещения фрагмента. Это не тот подход, который мы хотим с помощью MvxDialogFragment.


Решение:

Я считаю, что подход 1 является самым близким к получению нам успешно выполнение рабочего MvxDialogFragment. Все, что нам нужно сделать, это убедиться, что ViewModel проходит через его жизненный цикл.Так что в вашем MainPresenter убедитесь, чтобы создать экземпляр AnnotationEditViewModel на основании запроса и назначить его на AnnotationEditFragment:

protected override void ShowActivity(MvxViewModelRequest request, MvxViewModelRequest fragmentRequest = null) 
{ 
    if (request.ViewModelType == typeof(NamesViewModel)) 
    { 
     var dialog = new AnnotationEditFragment(); 
     var viewModel = Mvx.Resolve<IMvxViewModelLoader>().LoadViewModel(request, null) as AnnotationEditViewModel; 
     dialog.ViewModel = viewModel; 
     dialog.Show(Activity.FragmentManager, nameof(AnnotationEditFragment)); 

     return; 
    } 

    base.ShowActivity(request, fragmentRequest); 
} 

IMvxViewModelLoader используется, чтобы убедиться, ViewModel загружается в соответствии со стандартом жизненного цикла MVX ViewModel, CIRS :

  1. Строительство - с использованием IoC для Dependency Injection
  2. Init() - инициализация параметров навигации
  3. ReloadState() - регидратация после tombstoning
  4. Start() - вызывается при инициализации и регидратации являются полными