Как можно добиться условного представления модели представления с помощью MvvmCross? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть логин viewmodel (с соответствующей страницей).В этой конкретной ситуации я использую Xamarin.Forms.

. Мне нужно, чтобы представление входа в систему было представлено как общее представление стека навигации в качестве представления, которое можно аннотировать с помощью [MvxModalPresentationAttribute].

Я показываю это представление в двух случаях:

  • первое представление, которое появляется, когда приложение запускается, а пользователь не выполнил вход (и далее работает без входа в систему);
  • во времяприложение работает (если пользователь не вошел в систему), но пользователь запросил некоторую функциональность, которая требует входа в систему в первую очередь.

Я думаю, что Custom Presenter - способ достижения этого, как это (для iOS)Например:

public class GeneralPresenter : MvxIosViewPresenter
{
    public override void Show(MvxViewModelRequest request)
    {
        // ...

        base.Show(request);
    }
}

Однако я не совсем понимаю, что делать дальше.(Особенно, если есть что-то конкретное в отношении Xamarin. Формы также должны быть сделаны).

Любые подсказки?

1 Ответ

0 голосов
/ 07 июня 2018

на Mvvmcross.core 5.7.0. Если вы хотите представить представление с модальным стилем на iOS, вы можете добавить атрибут MvxModalPresentation к представлению:

[MvxModalPresentation(
        // Add this to modify the present view's style
        //ModalPresentationStyle = UIModalPresentationStyle.PageSheet,
        //ModalTransitionStyle = UIModalTransitionStyle.CoverVertical
    )]
public class SecondView : MvxViewController
{
    ...
}

Затем способ представленияэто представление аналогично push:

private readonly Lazy<IMvxNavigationService> _navigationService = new Lazy<IMvxNavigationService>(Mvx.Resolve<IMvxNavigationService>);
async private void ExecuteCommand()
{
    await _navigationService.Value.Navigate<SecondViewModel>();
}

При последнем закрытии это представление должно выглядеть следующим образом:

async private void ExecuteCommand()
{
    await _navigationService.Value.Close(this);
}

Обновление:

После обновления Mvvmcross до 6.0.1.0, мы можем использовать интерфейс IMvxOverridePresentationAttribute, чтобы определить стиль представления представления.Сделайте, чтобы представление реализовало интерфейс:

public class SecondView : MvxViewController<SecondViewModel>, IMvxOverridePresentationAttribute
{
    ...
    public MvxBasePresentationAttribute PresentationAttribute(MvxViewModelRequest request)
    {
        var instanceRequest = request as MvxViewModelInstanceRequest;
        SecondViewModel viewModel = instanceRequest?.ViewModelInstance as SecondViewModel;

        if (viewModel.IsModalView)
        {
            return new MvxModalPresentationAttribute();
        }
        return new MvxChildPresentationAttribute();
    }
    ...
}

IsModalView определено в моей ViewModel.когда мы хотим представить представление, используйте это для изменения стиля:

public class SecondViewModel : MvxViewModel<bool>
{
    ...
    public override void Prepare(bool parameter)
    {
        IsModalView = parameter;
    }
    public bool IsModalView { set; get; }
    ...
}
// The navigate method
await _navigationService.Value.Navigate<SecondViewModel, bool>(false);
...