Mvvm 重置Caliburn Micro创建的ViewModels
我正在尝试在使用Caliburn Micro的Windows应用商店应用程序中实现注销功能 我面临的挑战是,如果一个用户注销,然后作为另一个用户再次登录,那么在应用程序启动时实例化的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
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
将允许我清除所有型号。但是,我需要重置或重新初始化我的模型。我想这可以在激活中完成