将MvxDialogFragment与ViewModel绑定

时间:2016-07-22 09:40:33

标签: android mvvm xamarin.android mvvmcross android-dialogfragment

我有ViewModel和DialogFragment用于查看此VM。 在核心中,我以这种方式展示VM

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;
}
...
}

我在Mainvresenter中用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的任何活动或片段/ 如何使用绑定到VM的对话框?

1 个答案:

答案 0 :(得分:3)

问题:

1。 Presenter处理请求方法 - ViewModel Null

使用此方法,ViewModel的{​​{1}}属性为null,因为片段上没有设置AnnotationEditFragment,因为它是在创建普通{Mvx时正常生命周期之外创建的。 {1}}。 ViewModel遵循不同的生命周期。

2。演示者未处理请求方法 - 无活动

使用这种方法,标准的Mvx片段生命周期试图在MvxFragments上执行。这需要指定一个Activity来放置片段。这不是MvxDialogFragment所需的方法。

<强>解决方案:

我认为方法1最接近于让我们成功实施工作MvxDialogFragment。我们需要做的就是确保ViewModel贯穿其生命周期。因此,在MvxDialogFragment中,请确保根据请求创建MvxDialogFragment的实例并将其分配给MainPresenter

AnnotationEditViewModel

AnnotationEditFragment用于确保根据Mvx ViewModel生命周期标准CIRS加载ViewModel:

  
      
  1. 构建 - 使用IoC进行依赖注入
  2.   
  3. Init() - 导航参数的初始化
  4.   
  5. ReloadState() - 墓碑后的补液
  6.   
  7. Start() - 初始化和补液完成时调用
  8.