c# - 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 被触发,但没有参数,这使图像源为空。
当按下后退按钮时,我该如何处理并再次传递或再次使用参数?
解决方案
OnNavigatedTo方法在另一个页面导航到它时执行。这在 ViewModel 被压入堆栈后调用,这意味着您需要将参数传回给它或检查属性是否已经具有 value,因为当您返回时, ViewModel 已经被压入堆栈,并且它保持之前设置的值。
解决方案将取决于您在开发时的偏好、可行性或易用性,页面是否会位于大堆栈的中间?如果是这样,也许在那之后的每一页上传递参数并不是最聪明的方法。
这是一个示例(请记住,这可能并不适合所有情况,但在大多数情况下它是):
public void OnNavigatedTo(INavigationParameters parameters)
{
if(Merchant == null)
Merchant = parameters.GetValue<Merchant>("merchant");
}
推荐阅读
- javascript - 按顺序大写字符串中的字母并创建一个数组来存储
- twilio - 我可以使用 Twilio Flow 呼叫一组销售团队号码,等待其中一个人接听,然后呼叫新的潜在客户并连接这两个号码吗?
- c# - 我可以强制子类实现接口吗?
- c++ - 执行步骤“make”时Qt Creator编译错误,-fno-stack-limit
- sql - 组合查询以创建单个数据集
- javascript - 如何防止第一次重新渲染 Formik
- javascript - 仅在字典位置的数组值总和 - Javascript
- node.js - 是否可以让员工在 Heroku 中“虚拟”24 小时/7 小时运行?
- node.js - sequelize ERROR: this.lib.createConnection is not a function when using node
- python - 如何使用 python 从 NBA 网站上抓取统计数据