簡體   English   中英

如何在Xamarin.Forms中將多個頁面的BindingContext設置為相同的ViewModel?

[英]How to set BindingContext of multiple pages to the same ViewModel in Xamarin.Forms?

我是Xamarin.Forms的新手,我想使用MVVM模式和XAML創建一個跨平台的應用程序。 在我的表單項目(pcl)中,我想將MainPageBindingContext以及將來的多個頁面設置為同一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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM