如何在 Xamarin.Forms 中将多个页面的 BindingContext 设置为同一 ViewModel

本文关键字:BindingContext 设置 ViewModel Xamarin Forms | 更新日期: 2023-09-27 18:33:49

我是Xamarin.Forms的新手,我想使用MVVM模式和XAML创建一个跨平台应用程序。在我的表单项目(pcl(中,我想将我的主页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
}

视图模型的内容并不重要。通过这种结构,我能够设置与多个窗口的 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 ();
    }
}

我知道这是设置页面绑定上下文的正确方法,但我想知道这是否会导致每次打开MainPage时创建一个具有默认值的新 ViewModel 对象。而且我不明白其他页面如何能够使用与MainPage相同的ViewModel对象。在我看来,上面的WPF项目代码是合乎逻辑和简单的。一个视图模型对象,仅此而已。我是否必须为每个页面创建不同的 ViewModel 类?这对我来说似乎是不对的。

那么有没有办法以某种方式创建一个 ViewModel 对象 - 也许在 App.cs 中?我怀疑。- 每个页面都可以使用的地方,我以后可能想添加到项目中。我希望我已经清楚了,提前谢谢你!

如何在 Xamarin.Forms 中将多个页面的 BindingContext 设置为同一 ViewModel

是的,您当然可以将页面的 BindingContext 设置为应用程序管理的对象;ViewModel 不必在构造函数中创建(甚至设置(;这恰好是许多示例代码所做的。

您可以采用多种方法:创建单个 ViewModel 并将其公开给使用该 ViewModelLocator 连接绑定上下文的任何视图的 ViewModelLocator,依赖项注入容器(如 MvvmLight 提供的 SimpleIOC(,其中 ViewModel 注册为单一实例,在页面工厂中手动设置它,等等。

使用在 ctor 中引用的视图模型定位器的简单示例是:

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 容器中提取等。