Несколько шагов, продиктованных MVVM ViewModel: передовой опыт?

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

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

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

Вопрос первый: «Что было первым?»

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

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

Мне не очень нравится чередовать «сначала просмотр» и «сначала модель просмотра», как это.

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

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

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

  1. иметь возможность подобрать команду "Сохранить", отправленную во внутреннюю модель просмотра.

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

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


person BoldBob    schedule 01.04.2011    source источник
comment
Взгляните на здесь, этот вопрос содержит некоторую связанную информацию   -  person Snowbear    schedule 01.04.2011
comment
View First - это только один правильный подход, потому что передача представления в модель представления нарушает принципы MVVM. Соответствующие представления применяются в xaml, например '‹view: SomeView DataContext = {Binding SomeInnerViewModel} /›'. Для связи используйте класс Messenger из библиотеки MvvmLight.   -  person vortexwolf    schedule 01.04.2011
comment
Я использую библиотеку DI и выбираю представления и модели представлений в их сопоставлениях, связывая все вместе в код модуля верхнего уровня. Но мои приложения никогда не были такими сложными. Это также не решает вашу проблему с дополнительным представлением. Такие вещи, как Prism Region функция может помочь в этом.   -  person Merlyn Morgan-Graham    schedule 17.11.2011


Ответы (1)


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

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

По этой причине в WPF я предпочитаю использовать DataTemplating. В app.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)

иметь возможность подобрать команду "Сохранить", отправленную во внутреннюю модель просмотра.

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

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

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

person Snowbear    schedule 01.04.2011