Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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
C# 如何将SimpleIoC和Messenger用于生存期对象/ViewModels?_C#_Wpf_Mvvm_Inversion Of Control_Mvvm Light - Fatal编程技术网

C# 如何将SimpleIoC和Messenger用于生存期对象/ViewModels?

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创建一

我有一个用户登录的应用程序,它表示用户注销之前的“生存期”对象。我正在使用MVVM Light,但不知道如何正确使用SimpleIoC(与Messenger一起使用)。
当前,我在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是否也是这样