Несколько шагов, продиктованных MVVM ViewModel: лучшие практики? - PullRequest
6 голосов
/ 01 апреля 2011

Представьте себе, что у вас есть представление, которое будет показывать несколько этапов сбора данных.Исходя из решений предыдущего шага, последовательность или конкретные экземпляры следующих шагов будут различаться.

Следуя рекомендациям пуристов MVVM, я полагаю, что наличие списка ViewModels во внешней ViewModel - это способ сделать это.и пусть внешний вид привязывает пользовательский элемент управления вкладки (или аналогичный) к этому.

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

Пункт первый:«Что было первым?»

Внешняя комбинация View / ViewModel, вероятно, будет «View First».Таким образом, представление либо получает ViewModel, либо создает его экземпляр.

Но когда дело доходит до списка ViewModel внутри этой внешней ViewModel: откуда берутся их соответствующие View?Какая организация отвечает за выбор лучшего вида для каждого из них?

Мне не совсем удобно чередовать «View First» и «ViewModel First», как это.

Point Two: Связь между ViewModels

Когда один из внутренних шагов ViewModel завершен, например, по нажатию кнопки «Сохранить» или «Далее», команда должна быть запущена для этой внутренней ViewModel, а затем должна быть показана следующая.

Для этого требуется, чтобы внешний ViewModel:

  1. мог получить команду сохранения, отправленную внутренней ViewModel

  2. иметь возможность доступа к данным во внутренней ViewModel.

Как обычно это происходит?Считается ли плохой практикой связывать внутренний и внешний вид модели с событиями?

1 Ответ

6 голосов
/ 01 апреля 2011

1) В моем понимании MVVM всегда говорит, что ViewModels first и Views связаны с уже созданным экземпляром ViewModels.Для всех внутренних / внешних ViewModels.

Откуда берутся их соответствующие виды?Какая организация отвечает за выбор наилучшего вида для каждого из них?

В WPF по этой причине я предпочитаю использовать DataTemplatingapp.xaml или каком-либо другом файле ресурсов для всего приложения вы определяете DataTemplates, специфичную для каждой из ваших ViewModels.В Views вы помещаете привязку к ViewModel в ContentPresenter, а DataTemplating переносит туда View.Пример:

App.xaml :

<Application.Resources>
    <DataTemplate DataType="{x:Type local:OuterViewModel}">
        <local:OuterView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:InnerViewModel}">
        <local:InnerView />
    </DataTemplate>
<Application.Resources>

OuterView.xaml :

<Grid>
    <!-- Assuming OuterViewModel has a property named 'InnerViewModel' -->
    <ContentPresenter Content="{Binding InnerViewModel}" />
</Grid>

2)

быть в состоянии подобрать команду Сохранить, отправленную внутренней ViewModel

Я бы поставил SaveCommand на OuterViewModel

beвозможность доступа к данным внутри внутренней ViewModel.

Я бы имел ссылку на каждую внутреннюю ViewModel в OuterViewModel

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