看看下面的代码。在视图的构造函数中设置了两个委托命令:
public DelegateCommand DeletePromotionCommand { get; set; }
public DelegateCommand EditPromotionCommand { get; set; }
public PromotionDetailViewModel(INavigationService navigationService, IPageDialogService pageDialogService)
: base(navigationService, pageDialogService)
{
Title = "Promoção";
DeletePromotionCommand = new DelegateCommand(DeletePromotion, CanDeletePromotion);
EditPromotionCommand = new DelegateCommand(EditPromotion, CanEditPromotion);
}
CanEditPromotion 在构造函数中设置 EditPromotionCommand 时被调用。CanEditPromotion方法如下所示:
private bool CanEditPromotion()
{
var userString = Preferences.Get("user", string.Empty);
if (userString == string.Empty)
return false;
var userId = (Guid)JObject.Parse(userString)["id"];
if (userId == Promotion.CreatedBy)
return true;
else
return false;
}
请注意,在第 4 句话中,我需要 Promotion 属性。此属性需要在视图的构造函数之前设置,因此它将为 null,并且在正好行处会中断应用。
在我应该使用以下代码来设置促销属性之前,但 Prism 不再具有 OnNavigatingTo 方法。推广信息来自之前的主页,并作为参数导航传递:
public override async void OnNavigatingTo(INavigationParameters parameters)
{
base.OnNavigatedTo(parameters);
try
{
IsBusy = true;
Promotion = parameters["promotion"] as Promotion;
var marketService = new Service<Market>();
Market = await marketService.GetAsync(Promotion.MarketId);
IsBusy = false;
}
catch (Exception)
{
IsBusy = false;
}
}
当我尝试在我的BaseViewModel上使用INavigatingTo时,它向我显示一条消息,说使用IInitialize代替。我试过了,但 Initialize 方法仍然在视图的构造函数之后触发。
如 Prism7.2 的官方发行说明所示,OnNavigatingTo
在经过 Prism 社区的大量考虑和反馈后,它已被弃用。这部分是由于 OnNavigatingTo 应该在将视图推送到导航堆栈之前运行以初始化您的 ViewModel。问题是随着时间的推移,它的意图正在丢失,人们试图滥用 API。我们前进的唯一方法是从INavigationAware
中删除对INavigatingAware
的引用,不幸的是,这会产生一个软中断,根本不调用OnNavigatingTo
。如果您直接引用INavigatingAware
则会出现硬编译错误。
要迁移代码,您应该将新的初始化 API 与IInitialize
、IInitializeAsync
或IAutoInitialize
一起使用。假设您只是使用 IInitialize,您将从以下位置更新您的旧代码:
public void OnNavigatingTo(INavigationParameters parameters)
{
// your code here
}
到新的 IInitialize 版本
public void Initialize(INavigationParameters parameters)
{
// your code here
}
请记住,如果您使用此异步版本,则长时间运行的任务必须在推送页面之前完成,从而导致导航明显延迟。因此,通常更可取的做法是简单地使用async void
以避免阻塞导航。
您可以在 Prism 7.2 发行说明中阅读更多信息
此处我是这样解决的:
在CanEditPromotion,我为Promotion属性进行了空验证:
private bool CanEditPromotion()
{
var userString = Preferences.Get("user", string.Empty);
if (userString == string.Empty)
return false;
var userId = (Guid)JObject.Parse(userString)["id"];
if (Promotion != null && userId == Promotion.CreatedBy)
return true;
else
return false;
}
并且我在设置编辑促销命令时观察到促销属性:
public DelegateCommand DeletePromotionCommand { get; set; }
public DelegateCommand EditPromotionCommand { get; set; }
public PromotionDetailViewModel(INavigationService navigationService, IPageDialogService pageDialogService)
: base(navigationService, pageDialogService)
{
Title = "Promoção";
DeletePromotionCommand = new DelegateCommand(DeletePromotion, CanDeletePromotion)
.ObservesProperty(() => Promotion);
EditPromotionCommand = new DelegateCommand(EditPromotion, CanEditPromotion)
.ObservesProperty(() => Promotion);
}
我使用 OnNavigatedTo 方法来设置促销属性:
public override async void OnNavigatedTo(INavigationParameters parameters)
{
try
{
IsBusy = true;
Promotion = parameters["promotion"] as Promotion;
var marketService = new Service<Market>();
Market = await marketService.GetAsync(Promotion.MarketId);
IsBusy = false;
}
catch (Exception)
{
IsBusy = false;
}
}