Навигация Prism нарушает привязку страницы после возврата на страницу - PullRequest
0 голосов
/ 13 октября 2019

У меня две страницы. на первой странице есть изображение с привязкой к источнику, на второй странице есть метка с привязкой к тексту.

при навигации с использованием призмы навигация navigateTo на вторую страницу работает привязка метки, но когда я нажимаю кнопку "Назад" нана первой странице изображение исчезает, затем при повторном переходе ко второй странице текст метки становится пустым.

В обновлении добавлена ​​дополнительная информация и некоторый код

На главной странице отображается список продавцов, при щелчке по элементу которых запускается команда, а в качестве параметра - Merchant obj, Первая страницаберет этот объект и выполняет другие операции с ним. Одна из функций - это скретч-игра, при нажатии на кнопку которой вы переходите на вторую страницу (скретч-игру), также связанную с командой и параметром Merchant Obj.

FirstВид страницы (страницы продавца):

<controls:CircleImage x:Name="logoimg"
TranslationY="-25" WidthRequest="100"
VerticalOptions="End"
BorderColor="#800080"
BorderThickness="2"
Source="{Binding Merchant.MerchantLogo}">
</controls:CircleImage>

Модель просмотра первой страницы:

 internal class MerchantPageViewModel : AppMapViewModelBase, INavigationAware
{      
        private NojoomAppManager manager;
        private readonly INavigationService _navigationService;
        private Merchant _merchant;
        public Merchant Merchant
        {
            get { return _merchant; }
            set { _merchant = value; RaisePropertyChanged(nameof(Merchant)); }
        }
        public MerchantPageViewModel(INavigationService navigationService) : base(navigationService)
        {
       // Azure Mobile SDK
            manager = NojoomAppManager.DefaultManager;

            _navigationService = navigationService;

        }

        public new DelegateCommand<object> ScratchGameNavigateCommand =>
           _scratchGameNavigateCommand ?? (_scratchGameNavigateCommand = new DelegateCommand<object>(ExecuteScratchNavigateCommand));

        private async void ExecuteScratchNavigateCommand(object obj)
        {
            var p = new NavigationParameters();
            p.Add("merchant", obj);

            await NavigationService.NavigateAsync("ScratchGame", p);
        }
public void OnNavigatedTo(INavigationParameters parameters)
        {
            Merchant = parameters.GetValue<Merchant>("merchant");

        }

}

Вид второй страницы (скретч-игра)

<Label x:Name="Credit" FontSize="Large" FontAttributes="Bold" VerticalOptions="Center"></Label>

этот ярлык принимает свое значениеиз вызова API

код второй страницы:

private Merchant Merchant = new Merchant();        
private Wallet Wallet = new Wallet();
        public ScratchGame()
        {
            InitializeComponent();
            manager = NojoomAppManager.DefaultManager;

        }

private async Task Getwallet()
        {
            try
            {
                var wallets = await manager.GetWalletByIdAsync(Merchant.Id, Settings.UserId, false);
                Wallet = wallets.First();
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }        

public void OnNavigatedTo(INavigationParameters parameters)
        {
                Merchant = parameters.GetValue<Merchant>("merchant");
        Task.Run(async () => { await Getwallet(); }).Wait();
        Credit.text =  Wallet.SilverStars.ToString();
        }

Обновление 2 после дальнейшего исследования, когда я нажимаю кнопку возврата на второй странице, первая страница NavigatedTo являетсязапускается, но без параметра, который делает источник изображения нулевым.

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

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Метод OnNavigatedTo выполняется, когда к нему переходит другая страница. Вызывается после того, как ViewModel был помещен в стек, это означает, что вам нужно либо передать параметр обратно ему ИЛИ проверить имеет ли свойство уже значение , поскольку при обратном переходе ViewModel уже помещается в стек и сохраняет значения, установленные ранее.

Решение будет зависеть от вашегопредпочтение, жизнеспособность или простота использования при разработке, будет ли страница в середине большого стека? если это так, то, возможно, передача параметра на каждую страницу после этой не самый разумный путь.

Вот пример ( помните, что это может не подходить для каждой ситуации, но в большинстве случаев это):

public void OnNavigatedTo(INavigationParameters parameters)
{
    if(Merchant == null)
       Merchant = parameters.GetValue<Merchant>("merchant");
}
0 голосов
/ 14 октября 2019

Я нашел решение, просто добавляю эту строку кода на второй странице. Мне нужно снова передать параметр на первую страницу, иначе при переходе к нему он будет нулевым.

public void OnNavigatedFrom(INavigationParameters parameters)
{

    parameters.Add("merchant", Merchant);
}
...