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