Как открыть / показать новое окно в MVVM, используя шаблон посредника? - PullRequest
4 голосов
/ 05 марта 2011

Я очень новичок в парадигме WPF и MVVM, и я изо всех сил стараюсь ее освоить. У меня проблема в том, что многие новички MVVM сталкиваются с одной и той же проблемой, и кажется, что нет простого подхода. Итак, для простоты проблемной области вот лишь экспериментальная работа.

У меня есть главное окно с кнопкой «Создать». Я хочу показать экземпляр NewWindow.xaml, когда я нажимаю на эту кнопку. Как я могу сделать это из MainWindowViewModel? Может ли шаблон посредника помочь? Пожалуйста, предложите любую хорошую ссылку для реализации.

У меня также есть кнопка «Закрыть» в главном окне, и я хочу выйти из приложения, когда я щелкаю по этому. И мне снова нужна помощь: (

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

У меня была такая же проблема некоторое время назад.

по крайней мере, я использую очень простой подход, и я доволен. здесь - это мое решение.

в вашей модели представления вам просто нужно написать одну строку кода:

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", newdialogwindowVMgoeshere);
//do what you want with the dialogresult
1 голос
/ 05 марта 2011

Я поместил код диалога в CodeBehind View. Я все еще направляю команду через ViewModel, но ViewModel вызывает реализацию View и получает результат.

Предположим, у меня есть MainWindow View (xaml) и MainWindow ViewModel, и я хочу сохранить файл.

В представлении codebehind View (MainWindow.xaml.cs) я добавляю код для создания диалога и возвращаю имя сохраненного файла:

    public FileInfo OpenSaveFileDialog(string title, string filter)
    {
        var dialog = new SaveFileDialog
        {
            Filter = filter,
            Title = title
        };

        var result = dialog.ShowDialog();
        if (!result.Value) return null;

        return new FileInfo(dialog.FileName);
    }

В ViewModel у меня есть метод DoSaveFile ():

    public void DoSaveFile()
    {
        var file = OpenSaveFileDialog("Save File", "Super files (*.super)|*.super |All files (*.*)|*.*");
        if (file == null) return;
        //Save logic...
     }

    public DelegateCommand SaveFile { get { return Get("SaveFile", new DelegateCommand(DoSaveFile, () => true)); } }

В MainWindow.xaml у меня есть кнопка, привязанная к команде делегата:

    <Button Content="Save File" Command="{Binding SaveFile}"/>

Как и в случае с MVP, эта реализация является болтливой, но она отлично работает для тестирования и разделения проблем. Для меня имеет смысл оставить механику открытия окна классу View, даже несмотря на то, что он выглядит как активный просмотр.

...