2015-01-28 3 views
0

Я новичок в WPF, и я пытаюсь сохранить шаблон MVVM.
У меня есть основная форма, в которой будут представлены некоторые отчеты (в виде плиток, но это действительно не имеет значения).
Поэтому я хочу, чтобы пользователь дважды щелкнул один из отчетов, чтобы открыть отчет в новом отдельном окне.
Что я сделал, и я знаю, что это не правильный подход MVVM в том, что у меня есть эта команда на ReportsmanagerViewModelWPF открытые отдельные окна в MVVM

Private Sub OpenReportExecute() 
    Dim win As New ReportView 
    win.Show() 
End Sub 

Я не использую PRISM или любую другую структуру. Как я могу открыть окно, не нарушая MVVM?

+1

Вот пример того, как вы должны это сделать: http: // stackoverflow.com/questions/16652501/open-a-new-window-in-mvvm –

ответ

1

MVVM следует избегать ссылок на сборку презентаций из ваших моделей просмотра. Вам нужно вызвать новое окно из вашей модели представления, так как вы нарушаете зависимость?

Точно так же мы ломаем каждую зависимость - интерфейс!

Обычно я называю это услугой взаимодействия , поскольку окно является объектом интерактивности. На это могут быть разные мнения. YMMV и т.д.

public interface IDataInteractionService 
{ 
    //Implementations will display the data SOMEHOW 
    void DisplayData(Data d); 
} 

А теперь реализация

//Displayed data using windows! 
public class WindowedDataInteractionService: IDataInteractionService 
{ 
    public void DisplayData(Data d) 
    { 
     new Window().ShowDialog(); //basic implementation shows a window. 
    } 
} 

Хитрость здесь в том, что ваша модель представления не ссылается ни на WPF сборки непосредственно - это называется косвенность. В качестве бонуса у вас есть интерфейс, поэтому смена версии сервиса возможна с уверенностью, что вы не нарушите код модели представления. Это пример принципов SOLID, облегчающих жизнь для вас в будущем.

Вы не используете PRISM или другое Радиус впрыска Dependency, поэтому вызов для вас будет получать обслуживание к вашей модели просмотра. Общая практика заключается в использовании Singleton, чтобы сделать ваш IDataInteractionService доступным для приложения.

+0

Хорошее объяснение (звучит для меня все греки), но я попытаюсь его реализовать. – Nianios

+0

В целом это правильно, но вместо того, чтобы называть его 'IDataInteractionService', его следует называть по имени:' INavigationService' или 'IWindowsService', которые передают параметры более общим образом – Tseng

-1

Вот пример того, как вы должны сделать это, его в C#, но вы должны иметь представление о том, как это сделать: Open a new Window in MVVM

Извините за ответы 2 раза :), это была ошибка. Подход в этом примере состоит в том, чтобы делегировать создание этого нового окна в FactoryClass, который отвечает за создание объектов Windows, установить для него DataContext и вызвать метод Show. С этим решить 2 проблемы:

  1. Вашего ViewModel не должен открывать другие окна, и создать другой ViewModels

  2. Вы решаете зависимости в своем классе. Вы помещаете создание своего окна в класс Factory.

Это важно для UnitTesting вашего ViewModel. С большим количеством зависимостей сложнее проверить свою ViewModel.

Смежные вопросы