Как обрабатывать взаимодействие пользовательского интерфейса из модели представления без запроса пользователя, используя MVVM, PRISM и MEF - PullRequest
1 голос
/ 26 января 2011

Я работаю над приложением, использующим WPF, MVVM, Prism и MEF.

Я использую комбинацию навигации с запросом навигации, контроллеров с управлением представлениями с помощью диспетчера региона и событий через событиеагрегатор для запуска приложения в одном окне.Я использую подход, основанный на представлении, аналогично тому, как работает Stock Trader RIЭто прекрасно работает, когда любой код модели представления, который будет взаимодействовать с пользовательским интерфейсом (индикатор занятости), запускается пользователем, но когда он запускается за кулисами, могут быть проблемы.

Я знаю, что это может показатьсяплохая реализация, но я думаю, что у меня есть действительный сценарий.Мой конкретный пример связан с логином.

В настоящее время приложение запускается и загружает оболочку.Вид входа в систему загружается в основную область содержимого оболочки.Когда пользователь нажимает «войти», отображается индикатор занятости и выполняется вход в систему служб клиентских приложений.Когда вход в систему завершен, индикатор занятости исчезает, и экран переходит к домашнему экрану пользователя.

Это работает хорошо, потому что вход в систему и навигация инициируются пользователем, нажимающим кнопку входа в систему.

Так что теперь у меня есть новое требование, чтобы пользователь мог выбрать автоматический вход в форму входа в систему, чтобы в следующий раз, когда пользователь запускал приложение, представление входа в систему не отображалось, и вход происходил за кулисами..

Теперь, если я просто хочу вызвать функцию автоматического входа в систему, проблем нет, это само по себе не имеет взаимодействия с пользовательским интерфейсом и будет работать нормально.Но вход в систему занимает несколько секунд, и я хочу отобразить индикатор занятости.

Проблема в том, где я могу инициировать автоматический вход в систему?Конструктор модели представления оболочки?Модель представления оболочки PartImportsSatisfied реализация?В любом из этих мест представление оболочки (которое содержит мой индикатор занятости) еще не загружено.В результате ни один из необходимых мне ресурсов, таких как регионы и региональные менеджеры, недоступен.Итак, что может быть хорошим способом для меня реализовать это:

Проверьте, должен ли предыдущий пользователь автоматически входить в систему (выяснил эту часть)

 If yes then
  Show busy indicator
  Attempt to auto login
  If auto login was success
   Hide busy indicator
   Navigate to user home screen
  Else
   Hide busy indicator
   Navigate to login screen
 Else
  Hide busy indicator
  Navigate to the login screen

Любые идеи очень ценятся.

1 Ответ

2 голосов
/ 26 января 2011

Внедрите в свой ShellViewModel интерфейс, который будет иметь дело с концепцией загрузки.Не выполняйте эту логику в конструкторе ShellViewModel, так как это, как правило, плохая практика и должно использоваться не более чем для создания экземпляров объектов.

public class ShellViewModel : ILoadable
{
    public ShellViewModel()
    {

    }

    bool ILoadable.Load()
    {
         //this is where you can take care of your auto login
    }
}

Затем вы можете вызвать это в своем классе Bootstrapper,Если бы это было сделано в другом модуле, вы могли бы вызвать его в методе IModule.Initialize.

Я бы также сказал, что эта логика должна быть реализована внутри службы, которая может быть вызвана ShellViewModel, как упомянуто выше, или теоретически может быть вызвана непосредственно из класса Bootstrapper;позволяя ShellViewModel потенциально затем использовать данные с отслеживанием состояния из службы.

...