Я бы предложил главный мастер viewModel, который имеет коллекцию steps
моделей просмотра и обрабатывает навигацию между ними. Во время навигации он должен вызывать методы проверки в step
viewModels:
WizardVM:
public class WizardVM
{
// this commands should support CanExecute
public ICommand GotoNextCommand { get; private set; } // should open next step VM
public ICommand GotoBackCommand { get; private set; } // should open previous step VM
// this prop should be set by 'GotoNext', 'GotoBack' commands
public object CurrentStep { get; private set; }
// probably internally you will have a list of all steps:
private ICollection<object> _stepViewModels = ...;
}
WizardView:
<StackPanel>
<ContentPresenter Content="{Binding CurrentStep}">
<StackPanel Orientation="Horizontal">
<Button Command="{Binding GotoBackCommand}">Back</Button>
<Button Command="{Binding GotoNextCommand}">Next</Button>
</StackPanel>
</StackPanel>
UPDATE
Представления могут быть связаны с ViewModels через Datatemplating
. Например, добавьте это в ресурсы в App.Xaml
:
<DataTemplate DataType="{x:Type local:Step1ViewModel}">
<Step1View />
</DateTemplate>
<DataTemplate DataType="{x:Type local:Step2ViewModel}">
<Step2View />
</DateTemplate>
Ваши viewModels не должны абсолютно ничего знать о представлениях. Это означает, что WizardVM
должен
выставлять только другие модели представления, но не представления. Это практическое правило для MVVM.
UPDATE2 Упс, я забыл, что в Silverlight пока нет DataTemplating. В Silverlight я бы по-прежнему выставлял ViewModel, но связывал их с ContentPresenters
, используя конвертер, который преобразует ViewModel в соответствующий вид.