Android从服务访问MvxDialogFragment视图

时间:2016-11-03 14:21:54

标签: xamarin.android mvvmcross android-dialogfragment

我正在使用MVVMCross,并且遇到MvxDialogFragment绑定问题。 我有一个基本服务,在Core PCL项目中解决,在iOS和Android项目中添加从基本服务类派生的自定义服务实现。

在android服务中,我构建并显示MvxDialogFragment实例:

var top = (MvxFragmentActivity)Mvx.Resolve<IMvxAndroidCurrentTopActivity>().Activity;

if (top == null)
{
    throw new MvxException("Cannot get current top activity");
}

var dlg = new AlertDialog.Builder(top);
dlg.Create().Show();

dialog = new MyDialog
{
    Cancelable = false
};
dialog.Show(top.SupportFragmentManager, "");

我有简单的对话框布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/test_click_button"
        android:text="Test"
        app:MvxBind="Click TestClickCommand" />
</LinearLayout>

所以我的目标是从dialogFragment访问基本服务命令,该命令从服务实例化。我怎么能这样做?

作为替代方案,我想在服务中处理我的按钮单击,但无法找到执行此操作的方法,因为我的View,ViewModel或Dialog属性为null。

如何处理服务中的点击或实现自我绑定?

1 个答案:

答案 0 :(得分:0)

最后,我通过MvxDialogFragment订阅和服务注入实现了所需:

public class MyDialog : MvxDialogFragment
{
    private ISampleService _sampleService;

    public MyDialog(ISampleService sampleService)
    {
        _sampleService = sampleService;
    }

    public override Dialog OnCreateDialog(Bundle savedInstanceState)
    {
        EnsureBindingContextSet(savedInstanceState);

        var dialog = new AlertDialog.Builder(Activity);
        var view = this.BindingInflate(Resource.Layout.MyDialog, null);

        view.FindViewById(Resource.Id.test_click_button).Click += (sender, e) =>
        {
            _sampleService.TestClick();
            Dismiss();
        };

        dialog.SetView(view);

        return dialog.Create();
    }
}