Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何在mvvm环境下将服务注入视图模型_Wpf_Mvvm_Mvvm Light - Fatal编程技术网

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 
{
    ...
}