我试图在页面按钮单击事件上调用此GetProductStatus()
方法,但它在按钮单击之前加载。意味着当ViewModel被加载时,它也会自动加载。
我想声明这个VM方法"GetProductStatus()
";只在按钮单击事件发生时调用。
视图模型方法:
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();
}
这里,点击事件。
private async void ProductTypeButton_Clicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new ProductPage(_ViewModel));
}
我想声明这个VM方法"GetProductStatus()"是只在按钮点击事件发生时调用。
private async void ProductTypeButton_Clicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new ProductPage(_ViewModel));
}
对于上面你发布的代码,我们可以发现你的视图模型的构造函数将被调用,只要你调用代码new ProductPage(_ViewModel)
。
因此,您可以尝试删除构造函数ProductViewModel
GetProductStatus();
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){
等待导航。PushAsync(新ProductPage (_ViewModel));}
2。我没有给ProductViewModel
的构造函数添加参数,你可以根据你的需要修改上面我发布的代码。
抛开您正在处理视图和模型的事实。只要把它们想象成c#中的其他class
。
如果你需要告诉class A
"在这种情况下做点什么",你有什么选择?
- 在构造函数中传递一个参数:
public ProductViewModel(..., bool doGetProductStatus)...
,用法:new ProductViewModel(..., true);
- 使用MessagingCenter发布/订阅
_ViewModel.DoSomething();
创建方法后调用A.DoSomething();
: