返回页面后 Prism 导航打破页面绑定
Prism navigation breaks page binding after returning to the page
我有两个页面。第一页有一个带有源绑定的图像第二页有一个带有文本绑定的标签。
当我使用 prism navigation navigatedTo 导航到第二页时,标签绑定有效,但是当我点击后退按钮到第一页时,图像消失,然后当我再次导航到第二页时,标签文本为空。
更新添加了更多信息和一些代码
主页有一个商家列表视图,当点击一个项目时它会触发一个命令和商家对象作为参数,第一页接受这个对象并对其进行其他操作其中一个功能是点击时的刮刮游戏将您带到第二页(scratchgame)的按钮也绑定了命令和商家对象的参数。
第一页(商家页面)视图:
<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 被触发但没有使图像源为空的参数。
如何处理这个问题并在按下后退按钮时再次传递或再次使用参数?
我找到了解决方案,我只是在第二页添加了这行代码。
我需要再次将参数传递回第一页,否则导航回第一页时它将为空。
public void OnNavigatedFrom(INavigationParameters parameters)
{
parameters.Add("merchant", Merchant);
}
OnNavigatedTo 方法在另一个页面导航到它时执行。这是在 ViewModel 被压入堆栈后调用的,这意味着您需要 将参数传回 给它 OR检查是否属性已经有值,因为当你返回时,ViewModel已经压入堆栈,并保持之前设置的值。
解决方案将取决于您的偏好、可行性或开发时的易用性,页面是否会处于大堆栈的中间?如果是这样,也许在那个页面之后的每个页面上都传递参数不是最聪明的方法。
这是一个例子(记住,这可能并不适合所有情况,但对于大多数情况来说是):
public void OnNavigatedTo(INavigationParameters parameters)
{
if(Merchant == null)
Merchant = parameters.GetValue<Merchant>("merchant");
}
我有两个页面。第一页有一个带有源绑定的图像第二页有一个带有文本绑定的标签。
当我使用 prism navigation navigatedTo 导航到第二页时,标签绑定有效,但是当我点击后退按钮到第一页时,图像消失,然后当我再次导航到第二页时,标签文本为空。
更新添加了更多信息和一些代码
主页有一个商家列表视图,当点击一个项目时它会触发一个命令和商家对象作为参数,第一页接受这个对象并对其进行其他操作其中一个功能是点击时的刮刮游戏将您带到第二页(scratchgame)的按钮也绑定了命令和商家对象的参数。
第一页(商家页面)视图:
<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 被触发但没有使图像源为空的参数。
如何处理这个问题并在按下后退按钮时再次传递或再次使用参数?
我找到了解决方案,我只是在第二页添加了这行代码。 我需要再次将参数传递回第一页,否则导航回第一页时它将为空。
public void OnNavigatedFrom(INavigationParameters parameters)
{
parameters.Add("merchant", Merchant);
}
OnNavigatedTo 方法在另一个页面导航到它时执行。这是在 ViewModel 被压入堆栈后调用的,这意味着您需要 将参数传回 给它 OR检查是否属性已经有值,因为当你返回时,ViewModel已经压入堆栈,并保持之前设置的值。
解决方案将取决于您的偏好、可行性或开发时的易用性,页面是否会处于大堆栈的中间?如果是这样,也许在那个页面之后的每个页面上都传递参数不是最聪明的方法。
这是一个例子(记住,这可能并不适合所有情况,但对于大多数情况来说是):
public void OnNavigatedTo(INavigationParameters parameters)
{
if(Merchant == null)
Merchant = parameters.GetValue<Merchant>("merchant");
}