Обычно, когда я делаю что-то подобное, я передаю открытие диалоговых окон сервису, который позже можно смоделировать для целей тестирования. Что-то вроде:
public interface IDialogProvider
{
bool OpenDialog(IViewModel viewModel)
}
Тогда переданная в viewmodel граница может быть установлена как DataContext модального окна, и через шаблоны данных будет использоваться правильный вид.
Модель родительского представления может использовать эту службу при запуске команды для открытия дочернего элемента. Ребенок может выполнить всю необходимую обработку, и любая требуемая информация может быть получена от ребенка для получения истинного результата:
public void ExecuteEdit()
{
ChildViewModel childViewModel = GetViewModelForSelectedItem();
if (_dialogProvider.OpenDialog(childViewModel)
{
//child view model saved, trigger rebinding etc...
}
}
Чтобы обработать сценарий ошибки, если у вас есть определенный базовый класс для моделей представления, используемых этими диалогами, у вас может быть небольшой код, который обрабатывает закрытие окна. Я использовал бы независимое от вида событие в модели представления и закрывал бы окно, когда это событие вызвано. По мнению:
public DialogWindowView()
{
InitializeComponent();
DataContexctChanged += HandleDataContextChanged;
}
private void HandleDataContextChanged(object sender, EventArgs e)
{
IDialogViewModel viewModel = DataContext as IDialogViewModel;
if (viewModel != null)
{
viewModel.ActionSuccessful += HandleActionSuccessful
}
}
private void HandleActionSuccessful(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
Close();
}
У меня нет никаких проблем с тем, что этот код является представлением, поскольку он не отвечает за то, как выглядит модель, включая открытие или закрытие окон. Если вы полностью против идеи кода или вы не хотите связывать представление с типом модели представления, вы можете вместо этого перенести ответственность на DialogProvider:
public class DialogProvider : IDialogProvider
{
public bool OpenDialog(IDialogViewModel viewModel)
{
Window dialog = new DialogWindow();
dialog.DataContext = viewModel;
bool success = false;
viewModel.ActionSuccessful = (o, e) =>
{
dialog.Close();
success = true;
}
dialog.ShowDialog();
return success;
}
}