問題
這個問題與 Xamarin FAQ 2-25 是相稱的,也就是說,因為我們都在 ViewModel 內寫商業處理邏輯,可是,有些時候,因為特殊需求,想要在 ViewModel 內,可以呼叫 Code Behind 的方法,這樣該怎麼處理呢?
解答
在這裡,我們假設這個頁面名稱為 MainPage,而該頁面的 ViewModel 為 MainPageViewModel
底下為 Code Behind 的程式碼,我們在建構式內,取得了這個頁面的 ViewModel 物件,因此,透過 ViewModel 物件,指定頁面中的 TestDelegate 方法到 ViewModel 內的委派方法 myDelegate 物件內,因此,我們在 ViewModel 內,若呼叫 TestDelegate 這個委派方法,就會直接執行 Code Behind 內的方法了。
public partial class MainPage : ContentPage
{
MainPageViewModel fooMainPageViewModel;
public MainPage()
{
InitializeComponent();
fooMainPageViewModel = this.BindingContext as MainPageViewModel;
fooMainPageViewModel.myDelegate = TestDelegate;
}
public string TestDelegate(string para)
{
return $"Result:{para}";
}
}
底下是 ViewModel 的範例程式碼
public class MainPageViewModel : BindableBase, INavigationAware
{
public delegate string TestDelegate(string para);
public TestDelegate myDelegate;
public void OnNavigatedFrom(NavigationParameters parameters)
{
}
public void OnNavigatedTo(NavigationParameters parameters)
{
if (myDelegate != null)
{
var foo = myDelegate("Hello");
...
}
}
}