3

私はこのVMを表示するためにViewModelとDialogFragmentを持っています。コア内 私はこのようViewModelでMvxDialogFragmentをバインドする

this.ShowViewModel<AnnotationEditViewModel>(); 

でVMを示している私はこの要求を検出することができるShowv方法でMainPresenterにおける要求がある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に私はこのコードを入力した場合:)(私は、ダイアログ・ボックスが表示さ

var textAnnotationDialogFragment = Activity.FragmentManager.FindFragmentByTag(nameof(AnnotationEditFragment)) as AnnotationEditFragment ?? new AnnotationEditFragment(); 
textAnnotationDialogFragment.Show(Activity.FragmentManager, nameof(AnnotationEditFragment)); 
  • を、私はShowViewModelのためにこのコードを入力する場合、私は、VM/

と結合していません:

base.Show(request, fragmentRequest); 
  • 私はエラーを取得すること私のVMのアクティビティやフラグメントが見つかりませんでした。/ VMにバインドするダイアログを表示するにはどうすればよいですか?

答えて

3

問題:

1プレゼンター取扱要求アプローチ - ビューモデルヌル

ないViewModelフラグメントとして上に設定されていないとしてAnnotationEditFragmentViewModelプロパティがnullこのアプローチを用いてMvxが通常のMvxFragmentsを作成するときに使用する通常のライフサイクルの外に作成されています。 MvxDialogFragmentは別のライフサイクルに従います。

2プレゼンター未処理要求アプローチ - 無活動

標準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 :ナビゲーションパラメータの初期化- - 依存性注入

  • のInit()のためのIoCを使用して

    1. 建設
    2. ReloadState() -
    3. スタートを()ツームストーン後の再水和 - 初期化および再水和が完了したときに呼び出される
  • 関連する問題