如何注入服务以在mvvm light中查看模型 [英] how to inject service to view Model in mvvm light

查看:104
本文介绍了如何注入服务以在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆