Я пытаюсь вызвать этот метод 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));
}
Вы вызываете метод в конструкторе виртуальной машины, поэтому он будет вызван сразу после создания виртуальной машины. Вы не показываете, где вы создаете виртуальную машину, но, похоже, это происходит до создания страницы. Самым простым решением было бы вызвать его из OnAppearing в ProductPage.
Отложите в сторону тот факт, что вы работаете с представлениями и моделями. Просто думайте о них, как о любых других class
в С#.
Если вам нужно сказать class A
«сделайте что-нибудь в этих обстоятельствах», какие у вас есть варианты?
public ProductViewModel(..., bool doGetProductStatus)...
, использование: new ProductViewModel(..., true);
A.DoSomething();
после того, как вы его создали: _ViewModel.DoSomething();
Я хотел бы объявить этот метод 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
Средства сначала вызывают массив данных, а затем создают элементы управления динамической меткой для отображения этих данных. @ДжессиЧжан-MSFT
Извините, я не совсем понимаю, что вы имеете в виду, есть ли какие-либо другие проблемы при создании элемента управления динамической меткой для отображения этих данных?
Нет, в _ViewModel
есть данные массива await Navigation.PushAsync(new ProductPage(_ViewModel));
, поэтому перед созданием элементов управления я хочу вызвать метод как одно и то же событие щелчка @JessieZhang-MSFT
В настоящее время первый вызов функции выполняется после загрузки страницы, а при нажатии кнопки данные перемещаются на следующую страницу. @ДжессиЧжан-MSFT
Извините, мне не совсем понятна логика вашего кода. Вы имеете в виду, что хотите вызвать функцию GetProductStatus()
после появления страницы, верно?
when the button is clicked, the data moves to the next page.
При нажатии на кнопку вы попадаете на другую страницу вместо вызова функции GetProductStatus()
?
при нажатии кнопки GetProductStatus()
происходит вызов, а затем данные перемещаются на следующую страницу. @ДжессиЧжан-MSFT
Да При нажатии на кнопку вы попадаете на другую страницу вместо вызова функции GetProductStatus()
. @ДжессиЧжан-MSFT
ProductPage
следующая страница не текущая страница, верно?
Да, это не та страница @JessieZhang-MSFT
Давайте продолжим обсуждение в чате.
Разве логика вашего клика не может вызвать метод модели представления?