2013-12-12 2 views
0

Я пытаюсь реализовать функцию выхода из приложения Windows Store, над которым я работаю, и который использует Caliburn Micro.Сброс ViewModels, созданный Caliburn Micro

Проблема, с которой я сталкиваюсь, заключается в том, что если пользователь выходит из системы, а затем снова регистрируется как другой пользователь, объекты 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 не переоценивается и, следовательно, связанный с ним просмотр не обновляется.

Я попытался воссоздать Caliburn's WinRTContainer при выходе из системы, но приложение начало вести себя смешно. Я был подозрительным в том, чтобы спускать этот подход в любом случае, так что пока не слишком много в него вникал.

ответ

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(); 
     } 
    } 
} 
0

Lifestyle Сделайте свои ViewModel объектов?

Есть также override методы, такие как OnDeactivate, которые вы могли бы использовать для очистки конкретных пользовательских настроек, take a look here специально на экранах раздела для методов, которые вы можете override.

+0

'OnDeactivate' позволит мне очистить все модели, которые у меня есть. Однако мне нужно перезагрузить или повторно инициализировать мои модели. Я думаю, это можно сделать в 'OnActivate' – Hady

Смежные вопросы