繁体   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