Диалоги (Реальные) - PullRequest
       14

Диалоги (Реальные)

1 голос
/ 28 апреля 2010

Перепробовав несколько разных решений, я продолжаю возвращаться к этому. Мне нужен Window.ShowDialog, использующий класс ViewModelLocator в качестве фабрики через UnityContainer.

По сути, у меня есть View (и ViewModel), который при нажатии кнопки на представлении должен создать диалог (принимая пару параметров в своем конструкторе), который обработает некоторую логику и в конечном итоге вернет результат вызывающей стороне ( вместе с результатами всей логики, которую он вычислил).

Может быть, я ошибаюсь из-за того, что все еще смотрю на это с точки зрения Windows Forms, но я точно знаю, что хочу делать, и в идеале я хочу сделать это, используя WPF и MVVM. Я пытаюсь сделать эту работу для проекта, и в конечном итоге не хочу возвращаться к vanilla WPF, чтобы заставить его работать.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2010

Я нарушаю правила для реализации диалогового окна, но стараюсь свести его к минимуму. У меня есть метод OpenDialog в моей BaseViewModel:

public void OpenDialog(DialogViewModel model)
{
    this.MessengerInstance.Send<DialogViewModel, MainWindow>(model);
}

И в моем главном окне:

Messenger.Default.Register<DialogViewModel>(this, model =>
        {
            // Instantiate the dialog box
            var dlg = new DialogWindow();
            // Configure the dialog box
            dlg.Owner = this;
            dlg.Content = model;
            // Open the dialog box modally 
            dlg.ShowDialog();
        });

Таким образом, у меня только слабая связь между моей viewmodel и моим MainView. Вы можете сделать то же самое для закрытия, мой BaseDialogViewModel имеет метод:

public void CloseDialog()
    {
        this.MessengerInstance.Send<PopUpAction, DialogWindow>(PopUpAction.Close);
    }

(PopupAction - просто перечисление), и мое DialogWindow регистрируется для этого:

Messenger.Default.Register<PopUpAction>(this, action =>
        {
            switch (action)
            {
                case PopUpAction.Close:
                    this.Close();
                    break;
            }
        });

Вы также можете оставить получателя при отправке, чтобы исключить класс представления из модели представления, но в любом случае я думаю, что это приемлемое решение :)

0 голосов
/ 28 апреля 2010

Вы можете сделать это. Просто создайте экземпляр страницы / usercontrol / window и вызовите instance.ShowDialog().

Вот мои шаблоны T4 для создания представления / модели представления с обменом сообщениями для закрытия окна и другими приемами.

...