Как загрузить этот метод модели представления в событие onClick

Я пытаюсь вызвать этот метод GetProductStatus() для события нажатия кнопки страницы, но он загружается до нажатия кнопки. Означает, что когда ViewModel загружается, это также загружается автоматически.

Я хотел бы объявить, что этот метод VM "GetProductStatus()" вызывается только тогда, когда происходит событие нажатия кнопки.

Метод ViewModel:

private async void GetProductStatus()
{
    try
    {                   
        IsBusy = true;                         
        var status = await ProductStatusService.GetProductStatus(new ProductStatus()
        {
            StoreCode = s_code,
            StartTime = StartDateValue.AddMinutes(time1),
            EndTime = StartDateValue.AddMinutes(time2)
        });
        IsBusy = false;

        if (status != null)
        {           
                //Process happens                           
        }
        else
        {
            //Array is Null         
        }
        ProductStatus = status;
    }
    catch (Exception)
    {
        ProductStatus = null;
    }
}

Здесь метод объявлен.

public ProductViewModel(INavigation nav, Store store)
{
    _Nav = nav;
    
    GetProductStatus();
}

Здесь событие clicked.

private async void ProductTypeButton_Clicked(object sender, EventArgs e)
{   
    await Navigation.PushAsync(new ProductPage(_ViewModel));
}

Разве логика вашего клика не может вызвать метод модели представления?

tomerpacific 28.11.2022 03:31

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

Jason 28.11.2022 03:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
129
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Отложите в сторону тот факт, что вы работаете с представлениями и моделями. Просто думайте о них, как о любых других class в С#.

Если вам нужно сказать class A «сделайте что-нибудь в этих обстоятельствах», какие у вас есть варианты?

  • Передайте параметр в конструкторе: public ProductViewModel(..., bool doGetProductStatus)..., использование: new ProductViewModel(..., true);
  • Вызовите метод A.DoSomething(); после того, как вы его создали: _ViewModel.DoSomething();
  • Используйте публикацию/подписку MessagingCenter.
Ответ принят как подходящий

Я хотел бы объявить этот метод VM "GetProductStatus()" как вызывается только тогда, когда происходит событие нажатия кнопки.

   private async void ProductTypeButton_Clicked(object sender, EventArgs e)
  {   
    await Navigation.PushAsync(new ProductPage(_ViewModel));
  }

Для приведенного выше кода, который вы разместили, мы можем обнаружить, что конструктор вашей модели представления будет вызываться, как только вы вызываете код new ProductPage(_ViewModel).

Итак, вы можете попробовать удалить код GetProductStatus(); в конструкторе ProductViewModel

public ProductViewModel(INavigation nav, Store store)
{
    _Nav = nav;
    
    // remove code here
    //GetProductStatus();   
}

и добавьте команду в свою ViewModel и привяжите ее к кнопке на своей странице.

Пожалуйста, обратитесь к следующему коду:

public class ProductViewModel 
{
    public Command LoadDataCommand { get; set; }

    public ProductViewModel() {

        LoadDataCommand = new Command(loadData);

         // remove code here
        //GetProductStatus();
    }

    private void loadData()
    {
        GetProductStatus(); // add your code here
    }

    private async void GetProductStatus()
    {
        // other code
    }

 }

Примечание:

1. В этом состоянии вы также можете перемещаться следующим образом:

private async void ProductTypeButton_Clicked (отправитель объекта, EventArgs e) {
await Navigation.PushAsync (новая страница продукта (_ViewModel)); }

2. Я не добавляю параметр в конструктор ProductViewModel , вы можете изменить приведенный выше код в соответствии с вашими потребностями.

После нажатия кнопки на следующей странице создается множество динамических элементов управления метками для отображения данных. Поэтому я хотел бы вызвать данные массива(GetProductStatus) с тем же событием клика. @ДжессиЧжан-MSFT

Raj 28.11.2022 08:50

Средства сначала вызывают массив данных, а затем создают элементы управления динамической меткой для отображения этих данных. @ДжессиЧжан-MSFT

Raj 28.11.2022 08:50

Извините, я не совсем понимаю, что вы имеете в виду, есть ли какие-либо другие проблемы при создании элемента управления динамической меткой для отображения этих данных?

Jessie Zhang -MSFT 28.11.2022 08:54

Нет, в _ViewModel есть данные массива await Navigation.PushAsync(new ProductPage(_ViewModel));, поэтому перед созданием элементов управления я хочу вызвать метод как одно и то же событие щелчка @JessieZhang-MSFT

Raj 28.11.2022 08:59

В настоящее время первый вызов функции выполняется после загрузки страницы, а при нажатии кнопки данные перемещаются на следующую страницу. @ДжессиЧжан-MSFT

Raj 28.11.2022 09:05

Извините, мне не совсем понятна логика вашего кода. Вы имеете в виду, что хотите вызвать функцию GetProductStatus() после появления страницы, верно?

Jessie Zhang -MSFT 28.11.2022 09:09
when the button is clicked, the data moves to the next page. При нажатии на кнопку вы попадаете на другую страницу вместо вызова функции GetProductStatus() ?
Jessie Zhang -MSFT 28.11.2022 09:11

при нажатии кнопки GetProductStatus() происходит вызов, а затем данные перемещаются на следующую страницу. @ДжессиЧжан-MSFT

Raj 28.11.2022 09:13

Да При нажатии на кнопку вы попадаете на другую страницу вместо вызова функции GetProductStatus(). @ДжессиЧжан-MSFT

Raj 28.11.2022 09:16

ProductPage следующая страница не текущая страница, верно?

Jessie Zhang -MSFT 28.11.2022 09:18

Да, это не та страница @JessieZhang-MSFT

Raj 28.11.2022 09:19

Давайте продолжим обсуждение в чате.

Raj 28.11.2022 09:21

Другие вопросы по теме