gpt4 book ai didi

c# - 不同View的ViewModel Initialize方法

转载 作者:行者123 更新时间:2023-12-03 10:56:37 27 4
gpt4 key购买 nike

我有一个 TabbedPage,它显示正在进行的交付和已完成的交付。两个 View 的模型是相同的,只是我们获取数据的服务方法不同,所以我想重用 ViewModel。

通过将一些导航数据传递给我的 InitializeAsync 方法来重用 ViewModel 是否是一个很好的解决方案,这将允许我决定使用哪种服务方法来获取 View 的数据?

我会在 TabbedPage View 的代码隐藏中覆盖 OnCurrentPageChanged 并从那里初始化 ViewModel

TabbedPageView.xaml.cs

    protected override async void OnCurrentPageChanged()
{
base.OnCurrentPageChanged();
if (!(CurrentPage.BindingContext is TabbedPageViewModel tabbedPageViewModel)) return;
if (CurrentPage == DeliveriesInProgress)
{
await tabbedPageViewModel.InitializeAsync("DeliveriesInProgress");
}
else if (CurrentPage == FinishedDeliveries)
{
await tabbedPageViewModel.InitializeAsync("FinishedDeliveries");
}
}

TabbedPageViewModel.cs
    public async Task InitializeAsync(object navigationData)
{
if (navigationData is string deliveryType)
{
if (deliveryType == "InProgress")
{
Deliveries = await _deliveryService.GetDeliveriesInProgress();
}
else if (deliveryType == "Finished")
{
Deliveries = await _deliveryService.GetFinishedDeliveries();
}
}
}

有什么替代解决方案?

最佳答案

最好的方法是在 View 模型中使用两个不同的属性。然后,您可以将选项卡中的两个不同 View 绑定(bind)到关联的属性。

在您的 View 模型中:

public ObservableCollection<MyDeliveryModel> FinishedDeliveries;
public ObservableCollection<MyDeliveryModel> DeliveriesInProgress;

知道您可以添加两种方法来加载这些属性的数据:
public async Task RefreshFinishedAsync() 
{
// Your logic to load the data from the service
}
public async Task RefreshInProgressAsync()
{
// Your logic to load the data from the service
}

然后在您的 TabbedPage-Event 中:
if (CurrentPage == DeliveriesInProgress)
{
await tabbedPageViewModel.RefreshInProgressAsync();
}
else if (CurrentPage == FinishedDeliveries)
{
await tabbedPageViewModel.RefreshFinishedAsync();
}

使用此解决方案,您可以分离数据,并且无需在每次更改选项卡时重新加载整个数据。您可以检查集合中是否已经有一些数据,如果是...只是不要重新加载数据。只要用户想要就去做。

这提高了用户的性能和“等待时间”。

或者作为替代:
一次加载所有数据,只需过滤两个集合属性的数据。这减少了服务调用。

关于c# - 不同View的ViewModel Initialize方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54344406/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com