FreshMVVM - лучший способ открыть страницу из дочернего ContentView, который не наследуется от FreshBasePageModel

В следующем коде показаны 2 примера OpenPage Command. Один в MainPageModel работает, поскольку он происходит непосредственно от FreshBasePageModel. Однако второй вызов OpenPage в ChildPageModel не будет работать (или компилироваться). Я не хочу передавать всю родительскую модель. Итак, как с помощью FreshMVVM открыть новую страницу из ChildPageModel (и заставить работать кнопку «Назад» и т. Д.)?

public class MainPageModel : FreshBasePageModel
{
    public Command OpenPage
    {
        get
        {
            return new Command(() =>
            {
                CoreMethods.PushPageModel<NewPageModel>();
            });
        }
    }

    public ChildPageModel ChildPageModel { get; set; }
}

public class ChildPageModel 
{
    public Command OpenPage
    {
        get
        {
            return new Command(() =>
            {
                // ??????
                CoreMethods.PushPageModel<NewPageModel>();
            });
        }
    }
}

person John Livermore    schedule 19.09.2019    source источник


Ответы (3)


Вам также следует сделать так, чтобы ChildPageModel унаследовал от FreshBasePageModel. Все модели страниц должны наследовать от FreshBasePageModel

person XAM Buddy    schedule 21.09.2019

Я делаю простой пример с тремя страницами (MainPage, SecondPage, ThirdPage). Вы можете скачать исходный файл папки FreshMVVMDemo с HitHub. https://github.com/WendyZang/Test.git

Если вы хотите открыть новую страницу, вы можете добавить команду на дочернюю страницу.

#region Commands
    public Command GotoPageCommand
    {
        get
        {
            return new Command(async () =>
            {
                await CoreMethods.PushPageModel<ThirdPageModel>(); //replace the ThirdPageModel with the page you want to open
            });
        }
    }
    #endregion

Если вы хотите вернуться, добавьте команду, как показано ниже.

 #region Commands
    public Command GoBackSecondCommand
    {
        get
        {
            return new Command(async () =>
            {
                //await CoreMethods.PopPageModel();  //go back to main page
                await CoreMethods.PushPageModel<SecondPageModel>(); //Go back to third page
            });
        }
    }
    #endregion

введите здесь описание изображения

person Wendy Zang - MSFT    schedule 23.09.2019
comment
Спасибо за Ваш ответ. В вашем примере есть 3 страницы, все из которых наследуются от FreshBasePageModel. На самом деле я спрашиваю, как перейти на страницу из дочерней модели страницы, которая не наследуется от FreshBasePageModel. И это простой пример выше, чтобы подчеркнуть то, что я пытаюсь достичь. У меня есть веская причина для такого структурирования кода. - person John Livermore; 24.09.2019
comment
@JohnLivermore FreshBasePageModel - это базовый класс пакета NuGet FreshMVVM. Если вы хотите использовать FreshMVVM, вам нужно сначала унаследовать FreshBasePageModel. - person Wendy Zang - MSFT; 25.09.2019
comment
Спасибо. Я понимаю, как пользоваться FreshMVVM. Это не моя проблема. Если у вас сложная страница и вы хотите разбить ее на дискретные ContentView (моя ситуация) и у вас есть модели, которые соответствуют этим ContentView и являются свойствами за пределами основной FreshBasePageModel (как указано выше), то иногда вам нужно перейти на новую страницу за пределами этих дочерние модели. Расширение их из FreshBasePageModel не будет работать, поскольку нет контекста для его настройки (вы не «переходите» к этим дочерним представлениям). Я просто хочу знать, как разрешить что-то, что может вызывать новую страницу и поддерживать синхронизацию FreshMVVM. - person John Livermore; 25.09.2019
comment
Мы не могли этого сделать, все дочерние страницы, на которые мы хотим перейти с сохранением FreshMVVM в асинхронном режиме, должны все унаследовать эту базовую модель. - person Wendy Zang - MSFT; 08.10.2019

Следующий код выполнит это ...

var page = FreshPageModelResolver.ResolvePageModel<MainPageModel>();
var model = page.GetModel() as MainPageModel;
var navService = FreshMvvm.FreshIOC.Container.Resolve<IFreshNavigationService>();
await navService.PushPage(page, null);
person John Livermore    schedule 24.10.2019