Prism Forms不再有OnNavigatingTo。如何在 View 的构造函数之前运行一些代码?



看看下面的代码。在视图的构造函数中设置了两个委托命令:

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 与IInitializeIInitializeAsyncIAutoInitialize一起使用。假设您只是使用 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;
}
}

相关内容

  • 没有找到相关文章

最新更新