gpt4 book ai didi

c# - Xamarin.Forms 如何将多个页面的 BindingContext 设置为同一个 ViewModel?

转载 作者:行者123 更新时间:2023-11-30 20:46:06 24 4
gpt4 key购买 nike

我是 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 的内容并不重要。通过这种结构,我能够将相同的 _ViewModel 对象设置为多个窗口的 DataContext。 Xamarin.Forms 中是否有与此等效的内容?

这是来 self 的 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;这恰好是很多示例代码所做的。

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

使用构造函数中引用的 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 上的 setter 设置 _myViewModel 成员,将其从 IOC 容器中拉出,等等。

关于c# - Xamarin.Forms 如何将多个页面的 BindingContext 设置为同一个 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27407947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com