Вот способ сделать это.Я не знаю, что это лучший способ, но я также не знаю, насколько хорош этот способ разработки пользовательского интерфейса.Например, если мой контроль исчезает, когда я помещаю в него действительные данные, как мне вернуть их обратно, если я понимаю, что допустил ошибку?Есть причина, по которой мастера имеют кнопку «Назад».
Сначала создайте класс модели базового представления, который предоставляет логическое свойство IsValid
.(В моем примере я называю это ValidatingViewModelBase
.) Каждое из ваших представлений будет использовать модель представления, производную от этого класса.В каждой модели представления после того, как все свойства являются действительными, установите для IsValid
значение true.
Далее создайте пользовательский элемент управления для каждой модели представления, как это делается в любом приложении MVVM.Пользовательский интерфейс будет иметь больше смысла, если они имеют одинаковый размер.
Теперь создайте модель представления, которая представляет экземпляры этих моделей представления в виде свойств (в моем примере они называются Page1
,Page2
и т. Д.) И создайте привязанное к нему представление:
<Grid>
<Grid.Resources>
<Style x:Key="{x:Type ValidatingViewModelBase}">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsValid}" Value="True">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style>
<local:UserControl4 DataContext="{Binding Page4}"/>
<local:UserControl3 DataContext="{Binding Page3}"/>
<local:UserControl2 DataContext="{Binding Page2}"/>
<local:UserControl1 DataContext="{Binding Page1}"/>
</Grid>
(Предполагается, что DataContext
для сетки уже установлено.)
Как это работает: Grid
представляет элементы управления в том же месте на экране, упорядоченные сзади вперед.Поскольку они имеют одинаковый размер и непрозрачны, виден только последний из представленных.
Когда свойство IsValid
устанавливается в представлении Page1
, стиль меняет свой Visibility
до Hidden
.Теперь страница 2 видна.Это продолжается до тех пор, пока все четыре страницы не будут действительными.Поскольку мы устанавливаем Visibility
в Hidden
, а не Collapsed
, Grid
остается неизменным даже после того, как все четыре страницы невидимы.
Я не проверял это, поэтому яне знаю, как плохо вы будете иметь время с проблемами фокуса.Когда страница 1 становится невидимой, вы, вероятно, захотите, чтобы первый элемент управления на странице 2 получил фокус клавиатуры.Возможно, вам придется взглянуть на обсуждение логического фокуса в Обзор фокуса , чтобы узнать, как с этим справиться.