3

我有查看此VM的ViewModel和DialogFragment。 在覈心I顯示VM以這種方式綁定MvxDialogFragment與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; 
} 
... 
} 

我在Showv方法在MainPresenter請求,其中i可以檢測到這種請求該代碼。

如果MainPresenter我輸入驗證碼

var textAnnotationDialogFragment = Activity.FragmentManager.FindFragmentByTag(nameof(AnnotationEditFragment)) as AnnotationEditFragment ?? new AnnotationEditFragment(); 
textAnnotationDialogFragment.Show(Activity.FragmentManager, nameof(AnnotationEditFragment)); 
  • 我看到對話框,但我沒有與VM/

結合,如果我鍵入ShowViewModel代碼() :

base.Show(request, fragmentRequest); 
  • 我得到錯誤沒有發現我的虛擬機有任何活動或片段/ 我怎樣纔能有綁定到虛擬機的對話框?

回答

3

的問題:

1.處理好主持人請求的方式 - 視圖模型空

使用這種方法,因爲沒有ViewModel已在片段設置AnnotationEditFragmentViewModel屬性爲null它是在創建正常的MvxFragments時在Mvx使用的正常生命週期之外創建的。 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用於確保視圖模型根據MVX視圖模型生命週期標準裝載,CIRS

  1. 構建 - 使用的IoC爲依賴注入
  2. 初始化() - 導航的初始化參數
  3. ReloadState() - 立碑
  4. 啓動()後補液 - 調用時初始化和補液完成