首页 > 解决方案 > Prism导航返回页面后打破页面绑定

问题描述

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

当我使用 prism navigation navigatedTo 导航到第二页时,标签绑定有效,但是当我点击返回按钮到第一页时,图像消失,然后当我再次导航到第二页时,标签文本为空。

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

主页有一个商户列表视图,当点击一个项目时它会触发一个命令,商户 obj 作为参数,首页采用这个对象并对其进行其他操作,其中一个功能是点击一个按钮时的刮刮游戏,它会带你到第二页(scratchgame)也绑定了命令和Merchant Obj的一个参数。

首页(商家页面)视图:

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

第一页 ViewModel :

 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 被触发,但没有参数,这使图像源为空。

当按下后退按钮时,我该如何处理并再次传递或再次使用参数?

标签: c#xamarinmvvmxamarin.formsprism

解决方案


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

解决方案将取决于您在开发时的偏好、可行性或易用性,页面是否会位于大堆栈的中间?如果是这样,也许在那之后的每一页上传递参数并不是最聪明的方法。

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

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

推荐阅读