В совершенном мире MVVM ViewModel ничего не знает о View.Реализует ли View какой-либо интерфейс вообще, не имеет значения с точки зрения ViewModel.
В вашем сценарии я считаю более важным, кто будет реагировать на события MoveNext
, MoveBack
и Canceled
.Скорее всего, это будет ViewModel.Что это означает, что вы, вероятно, могли бы использовать такие методы, как WizardMoved(object sender, EventArgs e)
в этих ViewModels.Посмотрите, что мы здесь сделали - ViewModel должен иметь какие-то косвенные знания о View.Это плохой знак.
Возможно, вместо этого вы могли бы подойти к проблеме по-другому.Возможно, вам нужен интерфейс IWizardMovement
, который определит методы для обработки событий перемещения мастера - и этот интерфейс будет реализован ViewModels.Поэтому, когда вы передаете ViewModel в View, он может легко подписать обработчики ViewModel на свои собственные события (обратите внимание, что на самом деле не имеет значения, какой интерфейс реализует View).
public interface IWizardMovementViewModel
{
void WizardMovedNext(object sender, EventArgs e);
void WizardMovedBack(object sender, EventArgs e);
void WizardMoveCanceled(object sender, EventArgs e);
}
Теперь, так как в MVVM Viewзнает о ViewModel (и никак иначе), вы можете легко использовать это знание:
// Wizard user control constructor
public Wizard(IWizardMovementViewModel viewModel)
{
MoveNext += viewModel.WizardMovedNext;
MoveBack += viewModel.WizardMovedBack;
Canceled += viewModel.WizardMoveCanceled;
}
ViewModel теперь отделен от View навсегда, и то, как выглядит ваш View, уже не важно (так какникогда не должен был быть на первом месте).