Mvvm 重置Caliburn Micro创建的ViewModels

Mvvm 重置Caliburn Micro创建的ViewModels,mvvm,windows-store-apps,caliburn.micro,Mvvm,Windows Store Apps,Caliburn.micro,我正在尝试在使用Caliburn Micro的Windows应用商店应用程序中实现注销功能 我面临的挑战是,如果一个用户注销,然后作为另一个用户再次登录,那么在应用程序启动时实例化的ViewModels仍然存在于内存中,并且引用了旧模型。因此,将使用第一个用户的过时数据显示视图 为了更好地解释我自己: public class LoginViewModel : Screen { private User _model; // Property gets init

我正在尝试在使用Caliburn Micro的Windows应用商店应用程序中实现注销功能

我面临的挑战是,如果一个用户注销,然后作为另一个用户再次登录,那么在应用程序启动时实例化的ViewModels仍然存在于内存中,并且引用了旧模型。因此,将使用第一个用户的过时数据显示视图

为了更好地解释我自己:

public class LoginViewModel : Screen
{        
    private User _model;

    // Property gets initialised only on instantiation of ViewModel class
    public User Model
    {
        get { return _model; }
        set
        {
            if (Equals(value, _model)) return;
            _model = value;
            NotifyOfPropertyChange(() => Model);
        }
    }

    // ViewModel constructor - instantiated once only by Caliburn on startup
    public LoginHeaderViewModel(IAuthService authService)
    {
        Model = _authService.User;
    }
}
当我的应用程序第一次启动时,Caliburn将自动实例化
LoginViewModel
,并运行其构造函数,然后获取当前登录的用户。在一个用户注销,另一个用户登录之后,
LoginViewModel
不会在运行时再次实例化,因为它已经存在。
模型
属性不会重新计算,因此关联视图不会被告知刷新自身


我尝试在注销时重新创建Caliburn的
WinRTContainer
,但应用程序开始表现得很滑稽。无论如何,我对这种方法持怀疑态度,所以现在还没有过多地研究它。

你的
ViewModel
对象有什么
生活方式


还有一些
覆盖
方法,例如
OnDeactivate
,您可以使用这些方法来清理用户特定的设置,特别是在屏幕部分,您可以
覆盖
我解决初始问题的方法(有很多方法)正在使用Caliburn事件聚合

我首先创建一个事件:

public class LoginEvent
{
    public bool IsloggedIn { get; set; }

    public LoginEvent(bool isloggedIn)
    {
        IsloggedIn = isloggedIn;
    }
}
当用户登录时,我确保发布登录事件的实例:

public LoginViewModel(IEventAggregator events)
{
    _events = events;
}

public async void SignIn()
{
    // Do login logic ...
    _events.Publish(new LoginEvent(true));
}
在每当新用户登录时都需要休息的ViewModel中,确保我订阅了
LoginEvent
,以便在触发时重新初始化我的模型。侦听事件的ViewModel必须实现
IHandle
界面

public class DependentViewModel : IHandle<LoginEvent>
{
    public DependentViewModel(IEventAggregator eventAggregator)
    {
        eventAggregator.Subscribe(this);
        InitialiseViewModel();
    }

    public async void InitialiseViewModel()
    {
        // Initialise all your model objects here...
    }

    public async void Handle(LoginEvent ev)
    {
        if (ev.IsloggedIn)
        {
            InitialiseViewModel();
        }
    }
}
公共类依赖视图模型:IHandle
{
公共依赖的IEWModel(IEventAggregator事件聚合器)
{
eventAggregator.Subscribe(此);
InitialiseViewModel();
}
公共异步void InitialiseViewModel()
{
//在此处初始化所有模型对象。。。
}
公共异步无效句柄(LoginEvent ev)
{
如果(ev.IsloggedIn)
{
InitialiseViewModel();
}
}
}

OnDeactivate
将允许我清除所有型号。但是,我需要重置或重新初始化我的模型。我想这可以在激活中完成