Wpf 如何在mvvm环境下将服务注入视图模型
我尝试使用依赖注入将服务注入视图模型。试试这个代码 视图模型定位器Wpf 如何在mvvm环境下将服务注入视图模型,wpf,mvvm,mvvm-light,Wpf,Mvvm,Mvvm Light,我尝试使用依赖注入将服务注入视图模型。试试这个代码 视图模型定位器 public class ViewModelLocator { public static MainViewModel _main; static ViewModelLocator() { ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); Sim
public class ViewModelLocator
{
public static MainViewModel _main;
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<IAccountService, AccountService>();
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<LoginViewModel>();
}
/// <summary>
/// Gets the Main property.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
"CA1822:MarkMembersAsStatic",
Justification = "This non-static member is needed for data binding purposes.")]
public IMainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<IMainViewModel>();
}
}
/// <summary>
/// Gets the Main property.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
"CA1822:MarkMembersAsStatic",
Justification = "This non-static member is needed for data binding purposes.")]
public LoginViewModel Login
{
get
{
return ServiceLocator.Current.GetInstance<LoginViewModel>();
}
}
/// <summary>
/// Cleans up all the resources.
/// </summary>
public static void Cleanup()
{
}
}
这是我的登录视图
public partial class Login : UserControl
{
ILoginViewModel _loginViewModel;
public Login(ILoginViewModel _loginViewModel)
{
this._loginViewModel = _loginViewModel;
InitializeComponent();
DataContext = _loginViewModel;
}
}
我的问题是,当我尝试在视图中注入时,对象引用为null,
如何在mvvm light中使用DI?您试图将ILoginViewModel注入登录视图,但似乎ILoginViewModel未注册,因此可能需要注册
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<IAccountService, AccountService>();
SimpleIoc.Default.Register<IMainViewModel, MainViewModel>(); //register view models
SimpleIoc.Default.Register<ILoginViewModel, LoginViewModel>();
}
还应在MainViewModel中执行IMainViewModel,使其通过容器进行解析
public class MainViewModel : ViewModelBase, IMainViewModel
{
...
}
我很困惑;您问题的标题意味着您正试图将
AccountService
注入LoginViewModel
,但您最后的评论意味着您正试图将其放入LoginView
。是哪一个?哦,对不起,是我的错,我是说LoginViewModel还有一个问题,LoginViewModel
没有实现ILoginViewModel
。我太累了,无法为这一点提出正确的继承结构,但我知道虚拟机应该实现它们的接口——除非我弄错了,LoginViewModel
应该从MainViewModel
继承,而不是实现IMainViewModel
。但最后一个可能是我错了
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<IAccountService, AccountService>();
SimpleIoc.Default.Register<IMainViewModel, MainViewModel>(); //register view models
SimpleIoc.Default.Register<ILoginViewModel, LoginViewModel>();
}
public class LoginViewModel : ViewModelBase, ILoginViewModel
{
...
}
public class MainViewModel : ViewModelBase, IMainViewModel
{
...
}