将MvxDialogFragment与ViewModel绑定

4

我有一个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;
}
...
}

我在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相关的任何活动或片段”的错误/ 我该如何使用绑定在VM中显示对话框?
1个回答

4

问题:

1. Presenter Handled Request方法-ViewModel为Null

使用这种方法时,AnnotationEditFragmentViewModel属性为空,因为在创建它时未设置ViewModel,因为它是在常规生命周期Mvx创建常规MvxFragments外部创建的。 MvxDialogFragment遵循不同的生命周期。

2. Presenter Unhandled Request方法-No Activity

使用这种方法时,尝试在MvxDialogFragment上执行标准Mvx片段生命周期。需要指定一个Activity将片段放置其中。这不是我们希望使用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进行依赖注入
  2. Init() - 初始化导航参数
  3. ReloadState() - 恢复从挂起中断中的数据
  4. Start() - 在初始化和恢复完成后调用

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接