如何将viewmodel方法加载到onClick事件



我试图在页面按钮单击事件上调用此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);
  • _ViewModel.DoSomething();创建方法后调用A.DoSomething();:
  • 使用MessagingCenter发布/订阅