Есть много способов достичь ваших требований. Это то, что я хотел бы сделать, что, я думаю, очень соответствует шаблону проектирования MVVM.
- Определите класс ViewModel, который содержит все переменные, которые вы хотите собрать (независимо от разбиения на страницы.
- Добавьте публичное свойство с именем 'currentPage'.
- Определить рамку мастера. Вероятно, элемент со StackPanel. Окно будет иметь заголовок вверху и область внизу для кнопок «предыдущий» и «следующий» (и «закончить», если хотите).
- В основной области StackPanel поместите a и свяжите его DataContext с ViewModel
- В ViewModel создайте команды Next и Pref (используйте Prism DelegateCommand или реализуйте свою собственную облегченную версию, производную от ICommand.
6 / Также свяжите кнопку «Готово» с командой, используя соответствующую логику CanExecute (собрали ли вы достаточно данных?).
- Логика Next и Prev CanExectue будет рассматривать currentPage. например предыдущая команда CanExecute вернет false, когда currentPage = 0.
- У вас будет 3 разных шаблона данных, по одному на каждую страницу. Каждый шаблон данных будет представлять различные подмножества свойств, которые вы хотите собрать на этой странице. Свяжите элементы управления пользовательского интерфейса со свойствами в ViewModel и используйте режим связывания двумя способами.
- Получите вашу ViewModel из INotifyPropertyChanged и получите все установщики для запуска соответствующего уведомления. Требуется хотя бы для свойства currentPage, но для завершения решения сделайте это для всех свойств.
- В командах Next и Prev метод Execute изменит свойство currentPage (сеттер должен запустить уведомление). Вид обновится автоматически.
- Для основной области ItemControl реализовать WizardTemplateSelector, производный от DataTemplateSelector. Определите его как ресурс и назначьте ItemControl.ContentTemplateSelector, используя привязку {StaticResource}.
- Если вы хотите, вы также можете иметь элемент управления List в левой части окна, с индексом Selected Item, привязанным к текущей странице.
РЕДАКТИРОВАТЬ (Объяснитель): Основная идея состоит в том, чтобы иметь одну ViewModel, которую можно просматривать в нескольких различных шаблонах данных, в зависимости от текущей страницы.