我是Xamarin的新手,具有一定的.NET背景,并且正在创建新的Xamarin.Forms应用程序的构建基块(使用XAML),就像Xamarin的新手一样,我进行了一些研究,发现MVVMLight是其中之一最常用的框架,所以我决定使用它。
关注在线tutorial之后,我陷入了正确的方式来注入视图模型正常工作所需的依赖项(自定义或全局服务)。
提到的教程遵循以下模式:
1)首先,它在共享库(PCL或NetStandard)中创建一个名为“ servicelocator.cs”的全局类,应在其中注册视图模型类和任何其他业务服务,并将视图模型公开为公共属性>
using MyApp.Services;
using MyApp.ViewModels;
using GalaSoft.MvvmLight.Ioc;
namespace MyApp.Infraestructure
{
public class ServiceLocator
{
public ServiceLocator()
{
//Service that connects with the API
SimpleIoc.Default.Register<IRestService, RestService>();
//ViewModels
SimpleIoc.Default.Register<AppMainPageViewModel>();
}
public AppMainPageViewModel AppMainPageViewModel => SimpleIoc.Default.GetInstance<AppMainPageViewModel>();
}
}
2)在App.xaml.cs类中,它创建一个公开属性,公开ServiceLocator类
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace MyApp
{
public partial class App : Application
{
private static ServiceLocator _locator;
public static ServiceLocator Locator => _locator ?? (_locator = new ServiceLocator());
public App()
{
InitializeComponent();
}
//...
}
}
3)在viewmodel类中,它在构造函数中设置了自定义服务的依赖关系
using MyApp.Services;
using Xamarin.Forms;
namespace MyApp.ViewModels
{
public class AppMainPageViewModel
{
public IRestService RestService { get; set; }
public AppMainPageViewModel(IRestService restService)
{
RestService = restService;
}
}
}
4)最后,使用先前设置的App.xaml.cs全局属性在AppMainPageView.xaml.cs中将BindingContext设置为视图模型。
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace MyApp.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class AppMainPageView : ContentPage
{
public AppMainPageView()
{
InitializeComponent();
BindingContext = App.Locator.AppMainPageViewModel;
}
}
}
最后一步对我来说似乎很奇怪,我不知道这在Xamarin.Forms中是如何工作的,但是对我来说,直接使用命名的全局属性而不是使用某种形式的viewmodel设置viewmodel的过程是很奇怪的构造函数注入。
Xamarin.Forms是否有可能直接在XAML或视图的构造函数中解决BindingContext的viewmodel依赖关系?
感谢您的帮助