3

Ich habe ViewModel und DialogFragment zum Anzeigen dieser VM. Im Kern zeige ich VM auf diese WeiseBinding MvxDialogFragment mit ViewModel

this.ShowViewModel<AnnotationEditViewModel>(); 

ich diesen Code haben in 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; 
} 
... 
} 

Ich habe Anfrage in MainPresenter in Showv Verfahren, in dem ich diese Anforderung erkennen kann.

wenn in MainPresenter i geben Sie diesen Code:

var textAnnotationDialogFragment = Activity.FragmentManager.FindFragmentByTag(nameof(AnnotationEditFragment)) as AnnotationEditFragment ?? new AnnotationEditFragment(); 
textAnnotationDialogFragment.Show(Activity.FragmentManager, nameof(AnnotationEditFragment)); 
  • I Dialog zu sehen, aber ich habe nicht mit VM/

verbindlich, wenn ich für ShowViewModel diesen Code eingeben() :

base.Show(request, fragmentRequest); 
  • ich erhalte Fehler, wurde keine Aktivität oder Fragment für meine VM gefunden/ Wie kann ich einen Dialog mit der Bindung an VM haben?

Antwort

3

Die Themen:

1. Presenter behandelter Antrag Ansatz - Ansichtsmodell Null

Mit diesem Ansatz der ViewModel Eigenschaft AnnotationEditFragment null ist wie kein ViewModel auf dem Fragment eingestellt worden ist, Es wird außerhalb des normalen Lebenszyklus erstellt, den Mvx beim Erstellen normaler MvxFragments verwendet. MvxDialogFragment folgen Sie einem anderen Lebenszyklus.

2. Presenter Unhandle anfordern Ansatz - Keine Aktivität

Mit diesem Ansatz die Standard MVX Fragment Lebenszyklus auf der MvxDialogFragment ausgeführt werden versucht. Dazu muss eine Aktivität angegeben werden, in die das Fragment eingefügt werden soll. Dies ist nicht der Ansatz, den wir mit der MvxDialogFragment wollen.


Lösung:

Ich glaube Ansatz 1 ist die nächst uns eine erfolgreiche Implementierung eines Arbeits MvxDialogFragment zu bekommen. Alles, was wir tun müssen, ist sicherzustellen, dass das ViewModel seinen Lebenszyklus durchläuft.Also in Ihrem MainPresenter stellen Sie sicher, eine Instanz der AnnotationEditViewModel basierend auf der Anforderung zu erstellen und weist es die 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 verwendet wird, um sicherzustellen, dass das Ansichtsmodell geladen ist nach dem MVX Ansichtsmodell Lifecycle-Standard, CIRS :

  1. Construction - mit IoC für Dependency Injection
  2. Init() - Initialisierung des Navigationsparameters
  3. ReloadState() - Rehydrierung nach
  4. starten Tombstoning() - aufgerufen, wenn die Initialisierung und Rehydrierung vollständig sind