![](/img/trans.png)
[英]Set BindingContext to ViewModel in XAML on Xamarin.Forms
[英]How to set BindingContext of multiple pages to the same ViewModel in Xamarin.Forms?
我是Xamarin.Forms的新手,我想使用MVVM模式和XAML創建一個跨平台的應用程序。 在我的表單項目(pcl)中,我想將MainPage的BindingContext以及將來的多個頁面設置為同一ViewModel。 這可能嗎? 讓我看看我在說什么。 下面是我的早期WPF項目( App.xaml.cs )的代碼片段:
public partial class App : Application
{
private MainWindow _MainWindow;
private MyViewModel _ViewModel;
public App()
{
_ViewModel = new MyViewModel();
_ViewModel.SomeEvent += new System.EventHandler(ViewModel_SomeEvent);
}
}
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
_MainWindow = new MainWindow();
_MainWindow.DataContext = _ViewModel;
_MainWindow.Show();
}
private void ViewModel_SomeEvent(object sender, EventArgs e)
{
//Do something
}
ViewModel的內容並不重要。 通過這種結構,我可以設置與多個窗口的DataContext相同的_ViewModel
對象。 Xamarin.Forms中有與此等效的東西嗎?
這是我的pcl項目( App.cs )中的簡單代碼:
public class App
{
public static Page GetMainPage ()
{
return new MainPage();
}
}
以及來自MainPage.xaml.cs的代碼:
public partial class MainPage : ContentPage
{
public MainPage ()
{
InitializeComponent ();
BindingContext = new MyViewModel ();
}
}
我知道這是設置頁面的BindingContext的正確方法,但是我想知道這是否會導致每次我打開MainPage
都使用默認值創建一個新的ViewModel對象。 而且我也不明白其他頁面將如何使用與MainPage
相同的ViewModel對象。 在我看來,以上WPF項目代碼是合理且簡單的。 一個ViewModel對象就是這樣。 我是否必須為每個頁面創建不同的ViewModel類? 對我來說,這似乎是錯誤的。
那么有沒有辦法以某種方式創建一個ViewModel對象-也許在App.cs中 ? 我對此表示懷疑。 -以后我可能要添加到項目中的每個頁面都可以使用的地方。 我希望我已經很清楚了,並預先感謝您!
是的,您當然可以將頁面的BindingContext設置為應用程序管理的對象。 不必在構造函數內部創建(或設置)ViewModel; 恰好是許多示例代碼所做的。
您可以采用幾種方法:一個ViewModelLocator創建一個ViewModel並將其公開給使用該ViewModelLocator連接綁定上下文的任何視圖,一個依賴項注入容器(例如MvvmLight提供的SimpleIOC),該ViewModel注冊為單例,在Page工廠中手動設置它,依此類推。
使用ctor中引用的ViewModelLocator的一個簡單示例為:
public static class ViewModelLocator
{
private static MyViewModel _myViewModel = new MyViewModel();
public static MyViewModel MainViewModel
{
get
{
return _myViewModel;
}
}
}
...
public partial class MainView : ContentPage
{
public MainView()
{
BindingContext = ViewModelLocator.MainViewModel;
}
}
...
public partial class SomeOtherView : ContentPage
{
public SomeOtherView()
{
BindingContext = ViewModelLocator.MainViewModel;
}
}
您也可以使用它,以便通過ViewModelLocator上的設置器設置_myViewModel成員,將其從IOC容器中拉出,等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.