C# 如何将SimpleIoC和Messenger用于生存期对象/ViewModels?
我有一个用户登录的应用程序,它表示用户注销之前的“生存期”对象。我正在使用MVVM Light,但不知道如何正确使用SimpleIoC(与Messenger一起使用)。C# 如何将SimpleIoC和Messenger用于生存期对象/ViewModels?,c#,wpf,mvvm,inversion-of-control,mvvm-light,C#,Wpf,Mvvm,Inversion Of Control,Mvvm Light,我有一个用户登录的应用程序,它表示用户注销之前的“生存期”对象。我正在使用MVVM Light,但不知道如何正确使用SimpleIoC(与Messenger一起使用)。 当前,我在MainViewModel中将该对象保存为自定义用户对象的CurrentUser属性,并通过构造函数将其传递给其他ViewModels,并将其保存为属性。但是我有一个问题,在某些地方,对象被覆盖/新建 这可能是错误的做法,因为我发现SimpleIoC可以使用GetInstance() 因此,正确的方法是使用Key创建一
当前,我在MainViewModel中将该对象保存为自定义
用户
对象的CurrentUser
属性,并通过构造函数将其传递给其他ViewModels,并将其保存为属性。但是我有一个问题,在某些地方,对象被覆盖/新建
这可能是错误的做法,因为我发现SimpleIoC可以使用GetInstance()
因此,正确的方法是使用Key创建一个User
对象,以便在需要的类中获取它,修改并保存它,以便其他类在调用时可以获取更新的值(或者可能的PropertyChanged?),对吗
我试图这样创建它,但对象显然没有更新:
public MainViewModel()
{
RegisterMessenger();
CurrentUser = SimpleIoc.Default.GetInstance<User>("123");
_dataService = SimpleIoc.Default.GetInstance<IDataService>();
Messenger.Default.Send(new NotificationMessage("GoToLoginPage"));
}
public User CurrentUser
{
get { return _currentUser; }
set { Set(ref _currentUser, value); }
}
public User CurrentPageViewModel
{
get { return _currenPageViewModel; }
set { Set(ref _currentPageViewModel, value); }
}
public void RegisterMessenger()
{
Messenger.Default.Register<NotificationMessage>(this, message =>
{
switch (message.Notification)
{
case "GoToLoginPage":
if (_loginViewModel == null)
_loginViewModel = new LoginViewModel(_dataService);
CurrentPageViewModel = _loginViewModel;
break;
// Other cases...
});
}
}
// -------------------------------------------------------------------------
public LoginViewModel(IDataService dataService)
{
UserObj = SimpleIoc.Default.GetInstance<User>("123");
_dataService = dataService;
LoginCommand = new RelayCommand(LoginExecute, LoginCanExecute);
}
public主视图模型()
{
RegisterMessenger();
CurrentUser=SimpleIoc.Default.GetInstance(“123”);
_dataService=SimpleIoc.Default.GetInstance();
sender.Default.Send(新的NotificationMessage(“GoToLoginPage”);
}
公共用户当前用户
{
获取{return\u currentUser;}
set{set(ref _currentUser,value);}
}
公共用户CurrentPageViewModel
{
获取{return\u currenPageViewModel;}
set{set(ref_currentPageViewModel,value);}
}
公共作废登记员()
{
Messenger.Default.Register(此消息=>
{
开关(message.Notification)
{
案例“GoToLoginPage”:
if(_loginViewModel==null)
_loginViewModel=新的loginViewModel(\u数据服务);
CurrentPageViewModel=\u loginViewModel;
打破
//其他情况。。。
});
}
}
// -------------------------------------------------------------------------
公共登录视图模型(IDataService数据服务)
{
UserObj=SimpleIoc.Default.GetInstance(“123”);
_数据服务=数据服务;
LoginCommand=新的RelayCommand(LoginExecute、logincanxecute);
}
如果我使用GetInstance()
调用ViewModels会更好吗。。但是,我如何将参数传递给他们,并让他们存活/重新创建/销毁
如果有人能给我指出正确的方向,那就太好了,谢谢 介意检查一下MVVM灯吗SImpleIoC@JohnEphraimTugado我已经读过这篇文章了,但不知道它的上下文,也不知道如何正确地使用它。获取实例并将其保存到属性时,只保存一个副本,但如何保存/更改已注册的副本…GetInstance(Key).SomeProperty=value似乎不是每次都正确调用它。您做了一些错误的事情,应该阅读和(IoC)containers@LionelPire谢谢你的文章,我会读的。我不确定MVVM Light SimpleIoC,但我使用的是MVVM Cross framework中类似的一篇。您只需修改该值。例如:var a=xx.GetInstance();a、 PropA=“cc”;当您在项目的另一部分得到相同的实例时,您会注意到PropA已变成“cc”。试试看SimpleIoC是否也是这样