Шаблон проектирования для одного окна с несколькими представлениями

У меня есть окно, которое будет содержать несколько подвидов. Например, при запуске пользователю будет представлен экран входа в систему, и когда пользователь нажимает «Войти» (и это удается), окно должно быть обновлено до нового вида.

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

Если да, то как мне уведомить главное окно о том, что подвид завершен? Кроме того, в настоящее время я использую страницу в качестве подвида; это правильно?

Одной из целей этого проекта для меня является изучение MVVM, поэтому MVVM-мотивация ответа очень ценится!

Заранее спасибо!


XAML для основного окна

<Window x:Class="CAST.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        >
    <Frame Source="/LoginPage.xaml"/>
</Window>

person T'n'E    schedule 24.03.2014    source источник


Ответы (1)


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

BeforeInsert
AfterInsert
BeforeUpdate
AfterUpdate
BeforeCancel
AfterCancel
OnError
...
...

Для переключения вида вашими основными операциями могут быть:

 OnViewLoad
 OnViewUnload
 Validate
 ...

Затем я поместил бы весь этот код общим образом в класс BaseView базового представления. После того, как у вас есть базовое представление, вы можете заставить все обычные представления наследовать функциональность BaseView. Вы можете расширить эту модель, создав BaseDataView:BaseView, в котором вы вводите свои общие операции пользовательского интерфейса базы данных, такие как проверка.

Затем ваша основная форма может в первую очередь работать с базовым или суперклассом, таким как ((BaseView)currentView).ValidateForm() и так далее, и так далее.

person Ross Bush    schedule 24.03.2014
comment
Спасибо за Ваш ответ! Кажется, это хороший способ, хотя я удивлен, что функциональности не было раньше. Я полагаю, что я бы начал с создания подкласса некоторого общего представления (например, Page) для создания BaseView. Что бы вы порекомендовали? - person T'n'E; 25.03.2014
comment
Это звучит как хорошее начало. Имеются встроенные функции и сторонние инструменты, которые помогут вам, наряду с подключением и другими областями. Тем не менее, вы должны собрать все воедино и придать ему функциональную логику. - person Ross Bush; 25.03.2014