我正在尝试在我正在使用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
在运行时不会再次实例化,因为它已经存在。不会重新评估Model
属性,因此不会告知关联的View刷新自己。
我尝试在注销时重新创建Caliburn的WinRTContainer
,但应用程序开始表现得很有趣。无论如何我都怀疑这种方法,所以当时还没有太多关注它。
答案 0 :(得分:1)
我解决初始问题的方式(有许多方法可以解决)使用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<T>
接口。
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();
}
}
}
答案 1 :(得分:0)
Lifestyle
个ViewModel
对象有哪些override
?
还有OnDeactivate
方法,例如override
可用于清除用户特定设置,take a look here专门用于屏幕部分,你可以{{1}}。