MVVM и команды, которые показывают больше GUI - PullRequest
6 голосов
/ 21 июня 2009

Мне нравится идея MVVM RelayCommand , предоставляемая ViewModel. Это красиво и элегантно, для операций, которые могут быть выполнены без дополнительного пользовательского ввода. Просто. Тестируемые.

Однако не все операции не являются интерфейсом пользователя. Некоторые требуют подтверждения («Вы уверены, что хотите удалить?»). Другие требуют больше информации еще. Открытие файла может повлечь за собой что угодно, начиная с диалога открытия файла и заканчивая полнофункциональным мастером импорта.

Как лучше всего в приложении MVVM писать команды, требующие ввода пользователем? Существует ли установленный шаблон для решения этой проблемы с помощью внедрения зависимости? Должен ли я написать обработчик KeyDown в коде позади, и он явно выполнить событие? Должен ли я прибегнуть к RoutedUICommand и поместить весь код «Показать следующий графический интерфейс» в мой View? Или есть что-то очевидное, что я полностью скучаю?

Ответы [ 2 ]

4 голосов
/ 21 июня 2009

Я обычно использую Dependency Injection, чтобы внедрить некую абстрактную вещь IShowTheInterface, а затем вызываю методы для абстракции из Команды. Затем эти методы должны дать вам ответы, которые вам необходимы, чтобы определить, следует ли вообще продолжать действие и какой вклад дал пользователь.

Я недавно использовал это в качестве примера в сообщении в блоге с немного другой темой .

1 голос
/ 21 июня 2009

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

ViewModel зависит от приложения, и не стоит расширять ViewModelBase до бесконечности. Вместо этого создайте повторно используемые поведения, чтобы расширить представление. В Expression Blend Gallery

есть несколько примеров поведения.

EDIT:

Поведения могут иметь свойства, и вы можете использовать эти свойства не только для указания характеристик поведения, но и для получения обратной связи:

<Button Content="Open Document">
    <i:Interaction.Behaviors>
        <local:FileOpenBehavior 
            FileNameTarget="{Binding ElementName=tbDocName}"/>
    </i:Interaction.Behaviors>
</Button>

В приведенном выше примере tbDocName может быть скрыто - или вы можете привязать свойство вашего ModelView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...