如何注入服务以在mvvm light中查看模型 [英] how to inject service to view Model in mvvm light
问题描述
我尝试使用依赖注入将服务注入视图模型.试试这个代码
I try to use dependency injection to inject service into view model. try this code
ViewModelLocator
ViewModelLocator
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()
{
}
}
MainViewModel
MainViewModel
public interface IMainViewModel
{
}
public class MainViewModel : ViewModelBase
{
private readonly IAccountService _accountService;
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel(IAccountService accountService)
{
_accountService = accountService;
}
}
我的LoginViewModel
my LoginViewModel
public interface ILoginViewModel
{
ICommand Authorize { get; set; }
}
public class LoginViewModel : ViewModelBase, IMainViewModel
{
private IAccountService _accountService;
public LoginViewModel(IAccountService _accountService)
{
this._accountService = _accountService;
Authorize = new RelayCommand(() => CheckAuthorized(), () => true);
}
public ICommand Authorize { get; private set; }
}
这是我的LoginView
and this my LoginView
public partial class Login : UserControl
{
ILoginViewModel _loginViewModel;
public Login(ILoginViewModel _loginViewModel)
{
this._loginViewModel = _loginViewModel;
InitializeComponent();
DataContext = _loginViewModel;
}
}
我的问题是,当我尝试注入View时,对象引用为null, 我如何在mvvm light中使用DI?
my question is, when i try to inject in my View, the object reference is null, how can i use DI in mvvm light?
推荐答案
您正在尝试将ILoginViewModel注入到Login视图中,但是好像ILoginViewModel尚未注册,因此您可能需要注册相同的
You are trying to inject ILoginViewModel into the Login view but seems like ILoginViewModel is not registered so you may need to register the same
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<IAccountService, AccountService>();
SimpleIoc.Default.Register<IMainViewModel, MainViewModel>(); //register view models
SimpleIoc.Default.Register<ILoginViewModel, LoginViewModel>();
}
感谢@Jason指出了这一点
thanks @Jason for pointing this out
可能是错误的LoginViewModel实现了IMainViewModel而不是ILoginViewModel
perhaps by mistake LoginViewModel is implementing IMainViewModel instead of ILoginViewModel
因此需要以这种方式纠正
so need to be corrected this way
public class LoginViewModel : ViewModelBase, ILoginViewModel
{
...
}
MainViewModel中的IMainViewModel也无意义,以使其通过容器解析
also implemtent IMainViewModel in MainViewModel to make it resolve via the container
public class MainViewModel : ViewModelBase, IMainViewModel
{
...
}
这篇关于如何注入服务以在mvvm light中查看模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!