Использование Silverlight MVVM с Prism / Unity, и необходимо определить, когда представление закрыто - PullRequest
4 голосов
/ 17 ноября 2009

Я пишу приложение, используя шаблон MVVM (Model-View-ViewModel), и использую биты Prism и Unity от команды Microsoft P & P. ​​

У меня есть вид со списком предметов. Эти элементы содержатся с ObservableCollection в ViewModel, к которой привязан список данных в представлении (ViewModel устанавливается как DataContext представления). Во ViewModel у меня работает таймер, который запускает опрос сервера на наличие новых данных каждые 30 секунд. Когда данные возвращаются, я направляю их в поток пользовательского интерфейса и добавляю новые данные в коллекцию ObservableCollection. Это все работает очень хорошо.

Проблема, с которой я столкнулся, заключается в том, что мне нужен таймер для остановки при закрытии представления. Я не уверен, какое событие смотреть здесь. Есть ли что-то в Unity, что скажет мне, когда представление будет заменено в регионе? Есть ли событие, которое лучше всего использовать для этого в представлении, и, возможно, передать это событие (или фасад) в ModelView? My View - это UserControl для каждого примера P & P. Не найдено ни одного события «Unload», ни метода для переопределения.

Я уже думаю о написании собственного сервиса для обработки изменений представления (своего рода фасад для RegionManager), и я мог бы просто реализовать общий интерфейс в моих представлениях, чтобы выполнить очистку или реализовать IDisposable на них, когда они удаляются из Посмотреть. Однако, если есть чистый способ сделать это с ограничениями базовой платформы Silverlight или Unity / Prism, я бы предпочел пойти по этому пути.

Редактировать - Ответ:

Я закончил тем, что отметил ответ Андерсона Имеса, просто выбрав тот, который был наиболее близок к тому, что я делаю, для моего решения. Но на самом деле, я использую части от PL и GraemeF, а также проголосовал за всех. Это был отличный ответ для меня, так как он дал мне лучшее представление о регионах, дал мне еще одну структуру, на которую я посмотрел, и убедился, что я, вероятно, пошел по правильному пути с внедрением сервиса для обработки изменений представления вместо простого вызова в RegionManager.

Ответы [ 3 ]

3 голосов
/ 18 ноября 2009

Я думаю, что вы ищете интерфейс IActiveAware из Framework Manager (см. RegionActiveAwareBehavior ):

RegionActiveAwareBehavior отвечает за уведомление представления, если оно активно или неактивно. Представление должно реализовывать IActiveAware для получения этих уведомлений об изменениях. Это активное осведомленное уведомление является односторонним для просмотра; представление не может влиять на свое активное состояние, изменяя активное свойство в интерфейсе IActiveAware .

2 голосов
/ 17 ноября 2009

Caliburn обращается к этому недостающему фрагменту Prism с помощью модели компонентов IPresenter и хорошо работает с Prism. Вы бы реализовали интерфейс IPresenter (или, более вероятно, использовали бы один из базовых классов) в своих моделях ViewModel и остановили таймер в OnShutdown и / или OnDeactivate.

Вы можете использовать Caliburn самостоятельно или посмотреть, как это реализовано.

1 голос
/ 17 ноября 2009

У меня была именно эта проблема, и в итоге я создал интерфейс для этого:

public IApplicationEvents
{
     void OnClose();
}

Я централизовал свой код для близкого обзора и в основном просто искал этот интерфейс перед удалением вида. Если бы он был там, я мог бы вызвать его (я проверил как само представление, так и свойство DataContext, если это был UIElement).

Я немного обдумал это, используя присоединенное свойство и EventAggregator, но это основная идея, и она работает хорошо.

Вы вправе отключить это при просмотре закрытий, особенно если вы используете DispatcherTimer (как вы должны). Эта вещь вызывает некоторые очень серьезные утечки памяти, если вы этого не сделаете.

...