重置Caliburn Micro创建的ViewModel

时间:2013-12-12 12:45:53

标签: mvvm windows-store-apps caliburn.micro

我正在尝试在我正在使用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,但应用程序开始表现得很有趣。无论如何我都怀疑这种方法,所以当时还没有太多关注它。

2 个答案:

答案 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)

LifestyleViewModel对象有哪些override

还有OnDeactivate方法,例如override可用于清除用户特定设置,take a look here专门用于屏幕部分,你可以{{1}}。