C# Prism导航在返回页面后中断页面绑定

C# Prism导航在返回页面后中断页面绑定,c#,xamarin,mvvm,xamarin.forms,prism,C#,Xamarin,Mvvm,Xamarin.forms,Prism,我有两页。第一页有一个绑定了源的图像,第二页有一个绑定了文本的标签 当我使用prism navigation Navigated导航到第二页时,标签绑定工作,但当我点击后退按钮到第一页时,图像消失,然后当我再次导航到第二页时,标签文本为空 更新添加了更多信息和一些代码 主页上有一个商户列表视图,当点击一个项目时,它触发一个命令,商户obj作为参数,第一个页面获取此对象并在其上执行其他操作。当点击一个按钮时,它会将您带到第二个页面(scratchgame),该页面也绑定了命令和商户obj的参数 第

我有两页。第一页有一个绑定了源的图像,第二页有一个绑定了文本的标签

当我使用prism navigation Navigated导航到第二页时,标签绑定工作,但当我点击后退按钮到第一页时,图像消失,然后当我再次导航到第二页时,标签文本为空

更新添加了更多信息和一些代码

主页上有一个商户列表视图,当点击一个项目时,它触发一个命令,商户obj作为参数,第一个页面获取此对象并在其上执行其他操作。当点击一个按钮时,它会将您带到第二个页面(scratchgame),该页面也绑定了命令和商户obj的参数

第一页(商户页)视图:


第一页视图模型:

 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");

        }

}
内部类MerchantPageViewModel:AppMapViewModelBase,INavigationAware
{      
私人NojoomAppManager;
私有只读INavigationService(导航服务);
私人商户;
公营商户
{
获取{return\u merchant;}
设置{u merchant=value;RaisePropertyChanged(nameof(merchant));}
}
public MerchantPageViewModel(INavigationService导航服务):基础(导航服务)
{
//Azure移动SDK
manager=NojoomAppManager.DefaultManager;
_导航服务=导航服务;
}
public new DelegateCommand ScratchGameNavigateCommand=>
_scratchGameNavigateCommand??(\u scratchGameNavigateCommand=newdelegateCommand(ExecuteScratchNavigateCommand));
专用异步void ExecuteScartchNavigateCommand(对象obj)
{
var p=新的导航参数();
p、 添加(“商户”,obj);
等待导航服务;
}
导航到上的公共void(INavigationParameters)
{
商户=参数。GetValue(“商户”);
}
}
第二页(scratch游戏)视图


此标签从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();
        }
私人商户=新商户();
私人钱包=新钱包();
公共游戏()
{
初始化组件();
manager=NojoomAppManager.DefaultManager;
}
专用异步任务Getwallet()
{
尝试
{
var wallets=wait manager.GetWalletByIdAsync(Merchant.Id,Settings.UserId,false);
钱包=钱包。首先();
}
捕获(例外情况除外)
{
Debug.WriteLine(例如消息);
}
}        
导航到上的公共void(INavigationParameters)
{
商户=参数。GetValue(“商户”);
运行(async()=>{await Getwallet();}).Wait();
Credit.text=Wallet.SilverStars.ToString();
}
更新2 进一步调查后,当我点击第二页上的后退按钮时,第一页导航到triggerd,但没有参数,这使得图像源为空


当按下“后退”按钮时,如何处理此问题并使参数再次传递或使用?

我找到了解决方案,只需在第二页添加这行代码。 我需要再次将paramater传递回第一页,否则返回时将为null

public void OnNavigatedFrom(INavigationParameters parameters)
{

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

当另一个页面导航到它时,将执行OnNavigatedTo方法。这是在ViewModel被推送到堆栈后调用的,这意味着您需要将参数传递回,或者检查属性是否已经有值,因为当您返回时,ViewModel已经被推到堆栈中,并且它会在之前设置值

这个解决方案将取决于你的偏好、生存能力或开发时的易用性,页面会在一个大堆栈的中间吗?如果是这样的话,那么在每个页面上传递参数并不是最聪明的方法

下面是一个示例(请记住,这可能并不适用于所有情况,但在大多数情况下都适用):

public void on导航到(INavigationParameters)
{
如果(商户==null)
商户=参数。GetValue(“商户”);
}

提供示例code@mshwf更新了问题,提供了更多信息和一些代码
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();
        }
public void OnNavigatedFrom(INavigationParameters parameters)
{

    parameters.Add("merchant", Merchant);
}
public void OnNavigatedTo(INavigationParameters parameters)
{
    if(Merchant == null)
       Merchant = parameters.GetValue<Merchant>("merchant");
}