Создание простого диалогового окна сохранения в Prism

Я пишу приложение с использованием фреймворка Microsoft Prism, и у меня возникли проблемы с поиском лучшего способа приблизиться к простому диалоговому окну style «Сохранить файл».
NB: Я могу » Я не использую стандартный диалог, поскольку я не сохраняю файлы в файловой системе, поэтому нужно написать что-то подобное с нуля.

Итак, вот основные элементы управления, которые у меня есть для моего диалога:

  • Пользовательский элемент управления, показывающий иерархию папок. (IFolderView)
  • Представление списка для отображения содержимого папки. (IFolderContentsView)
  • Текстовое поле, в котором пользователь может ввести имя сохраненных файлов.

Единственное реальное взаимодействие с формой заключается в том, что когда пользователь выбирает папку слева, представление списка справа заполняется содержимым папок.

Когда я начал писать диалог, я изначально создал пару регионов для своих пользовательских элементов управления и использовал обнаружение представлений, чтобы добавить свои представления. Я сделал это потому, что вводил IFolderView в другое место приложения. Теперь я обнаружил, что мне нужно кое-что знать об элементах управления в регионе, чтобы они могли взаимодействовать друг с другом. Я думал о EventAggregator, но это не подходит для простого диалога сохранения.

Мое решение этой проблемы - использовать инъекцию представления. Поэтому я прошу свой контейнер Unity реализовать IFolderViewModel и устанавливаю его представление как содержимое области во время инициализации. Таким образом, я знаю достаточно о пользовательских элементах управления в форме, чтобы она работала, но все еще слабо связаны.

Звучит ли это разумно? Есть ли способ лучше? Я что-то упускаю?


person Jon Mitchell    schedule 28.01.2010    source источник


Ответы (1)


Большую часть времени с Prism люди используют ISystemInteraction (что-то вроде ISystemCommands или подобное), чтобы вызывать диалоги или каким-либо образом взаимодействовать с файловой системой. Таким образом, он остается тестируемым, но ViewModel не несет ответственности за что-либо, зависящее от представления. Вот пример интерфейса:

public interface ISystemCommands
{
     //Raises a save file dialog with a prepopulated name
     void SaveFile(string name, byte[] content);
}

Затем вы должны предоставить реализацию, которая будет доступна из оболочки, которая будет взаимодействовать с файловой системой. Это и MVVM, и тестируемый (что мне нравится).

Здесь есть связанный вопрос, который в основном дает тот же ответ: Диалог открытия файла MVVM

person Anderson Imes    schedule 28.01.2010
comment
Спасибо за ответ, но это не совсем то, что я искал. Моя проблема в том, как заставить два элемента управления общаться друг с другом в простом диалоге, когда все, что я знаю о них, - это в каком регионе они находятся. Тем не менее, ваш ответ был мне полезен, спасибо! - person Jon Mitchell; 29.01.2010
comment
@JMitchell: это описание намного яснее. Чтобы два открытых представления (и, следовательно, их модели представления) могли общаться друг с другом, вы можете использовать агрегатор событий. Однако, если вам нужна двусторонняя связь, это, скорее всего, не подходит. В этом случае вы должны использовать тот же интерфейс, который я предложил, но сделать так, чтобы ViewModel целевого представления реализовал его, а не центральную службу для Shell. - person Anderson Imes; 29.01.2010