ViewModel Метод инициализации для разных видов - PullRequest
0 голосов
/ 24 января 2019

У меня есть TabbedPage, которая показывает текущие и завершенные доставки. Модель для обоих представлений одинакова, отличается только метод обслуживания, из которого мы получаем данные, поэтому я хотел бы повторно использовать ViewModel.

Было бы хорошим решением повторно использовать ViewModel, передав некоторые навигационные данные в мой метод InitializeAsync, который позволил бы мне решить, какой метод службы использовать для получения данных для представления?

Я бы переопределил OnCurrentPageChanged в кодовом элементе TabbedPage View и оттуда инициализировал 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();
            }
        }
    }

Какие могут быть альтернативные решения?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы можете сделать это, используя базовую модель представления и модель представления для каждой вкладки, которая использует основание.База тогда содержит ваши команды и поставки.Вы привязываете каждую страницу с вкладками к модели представления для этой страницы, поэтому вам не нужно проверять изменения вкладки.Когда вы создаете каждую модель представления, передайте информацию, необходимую для базы, чтобы знать, как запрашивать данные.Для каждого вида с вкладками, если они одинаковые для текущего и завершенного, используйте частичное представление и поместите его на обеих страницах с вкладками.Это дает гибкость в долгосрочной перспективе.

public class InProgressDeliveriesViewModel: BaseDeliveryViewModel{

     public InProgressDeliveriesViewModel():base(filterParams){}
}

public class FinishedDeliveriesViewModel: BaseDeliveryViewModel{

     public FinishedDeliveriesViewModel():base(filterParams){}
}

public class BaseDeliveryViewModel{

   private FilterObjectOfSomeSort _filterParams;

   public BaseDeliveryViewModel(filterParams whatever){
      //use these params to filter for api calls, data.  If you are calling the same 
      //endpoint pass up the filter
      _filterParams = whatever;
    }

   public ObservableCollection<MyDeliveryModel> Deliveries {get;set;}

   public async Task LoadDeliveries(){
       //use the filter params to load correct data
       var deliveries = await apiClient.GetDeliveries(filterParams); //however you 
       //are gathering data
   }

.... All of your other commands

}
0 голосов
/ 24 января 2019

Лучший способ - использовать два разных свойства в вашей модели представления. Затем вы можете связать два разных представления на вкладках со связанным свойством.

По вашему мнению модель:

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();
}

С помощью этого решения вы можете разделять данные, и вам не нужно перезагружать все данные каждый раз, когда вы меняете вкладки. Вы можете проверить, есть ли уже какие-либо данные в коллекции, и если это так ... просто не перезагружайте данные. Просто сделайте это, если пользователь этого хочет.

Это улучшает производительность и «время ожидания» для пользователя.

Или как альтернатива: Загрузите все данные одновременно и просто отфильтруйте данные для двух свойств коллекции. Это уменьшает сервис-звонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...