Android-доступ к представлению MvxDialogFragment из службы

Я использую 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.

Как можно обрабатывать клики в сервисе или реализовать самопривязку?


person Fragment    schedule 03.11.2016    source источник
comment
Если вы хотите получить доступ к представлению из службы, вы в основном делаете это неправильно. Шаблон Mvvm не предназначен для этого. Вы также говорите, что я не хочу размещать свои служебные команды ни в одной модели представления. Команды живут не в сервисах, а во ViewModels. ViewModels вызывают методы обслуживания. Может быть, я просто неправильно все понял...   -  person xleon    schedule 04.11.2016
comment
Спасибо за ответ! Я отредактировал вопрос, основная цель: как привязать кнопки диалогового фрагмента к сервисным командам   -  person Fragment    schedule 04.11.2016


Ответы (1)


Наконец, я добился желаемого с помощью подписки 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();
    }
}
person Fragment    schedule 04.11.2016