【问题标题】:how to inject service to view Model in mvvm light如何注入服务以在 mvvm light 中查看模型
【发布时间】:2014-06-06 02:56:54
【问题描述】:

我尝试使用依赖注入将服务注入视图模型。试试这个代码

视图模型定位器

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 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;
        }
    }

我的登录视图模型

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; } 

}

这是我的登录视图

public partial class Login : UserControl
{
    ILoginViewModel _loginViewModel;
    public Login(ILoginViewModel _loginViewModel)
    {
        this._loginViewModel = _loginViewModel;
        InitializeComponent();
        DataContext = _loginViewModel;
    }
}

我的问题是,当我尝试注入视图时,对象引用为空, 如何在 mvvm light 中使用 DI?

【问题讨论】:

  • 我很困惑;您问题的标题暗示您正在尝试将AccountService 注入LoginViewModel,但您最后的评论暗示您正在尝试将其放入LoginView。是哪个?
  • 对不起,我的错,我的意思是 LoginViewModel

标签: wpf mvvm mvvm-light


【解决方案1】:

您正在尝试将 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>();
    }

感谢@Jason 指出这一点

可能错误地 LoginViewModel 正在实现 IMainViewModel 而不是 ILoginViewModel

所以需要这样改正

public class LoginViewModel : ViewModelBase, ILoginViewModel
{
    ...
}

还在 MainViewModel 中实现 IMainViewModel 以使其通过容器解析

public class MainViewModel : ViewModelBase, IMainViewModel 
{
    ...
}

【讨论】:

  • 还有LoginViewModel没有实现ILoginViewModel的问题。我太累了,无法为此提出正确的继承结构,但我确实知道 VM 应该实现它们的接口 - 除非我弄错了,LoginViewModel 应该从 MainViewModel 继承而不是实现 @987654328 @。但我对最后一个可能是错的
猜你喜欢
  • 1970-01-01
  • 2019-05-11
  • 2011-07-12
  • 2011-01-29
  • 2011-11-25
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多