Каковы ваши стратегии привязки DataContext в MVVM?

эти два 1-часовых видео показывают шаг за шагом, как использовать шаблон MVVM для создания простых приложений викторины в Silverlight и WPF:

реализация модели-View-ViewModel в Silverlight

реализация Model-View-ViewModel в WPF

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

в подходе Silverlight мы установите DataContext посмотреть до ObservableCollection в ViewModel:

<views:QuestionView x:Name="QuestionDataView" />

QuestionViewModel qdata = new QuestionViewModel();
qdata.FetchQuestions();
QuestionDataView.DataContext = qdata.Questions;

в подходе WPF мы установите DataContext окно до ViewModel.

<view:QuizView Margin="4" />

base.DataContext = new QuizViewModel(Quiz.Create());

Кажется, что каждый пример MVVM, на который я смотрю, делает привязку DataContext в немного новой вариации, и я пытается заколачивать некоторая твердая земля о "как привязка DataContext выполняется в шаблоне MVVM".

что происходит в вашей голове, когда вы решаете связать DataContext с чем-то: зачем связывать DataContext окно / вид / список / etc. до ObservableCollection / ModelView / etc.? Каковы здесь Преимущества, Недостатки, стратегии?

любой входной ценится.

3 ответов


они упоминали, почему для Silverlight использовался другой подход? Это может быть просто ограничение платформы.

рекомендуется использовать саму модель вид . Фактически, вместо явного создания представления необходимо создать модель представления и разрешить представление с помощью WPF. Для этого зарегистрируйте DataTemplate:

<DataTemplate DataType="{x:Type local:MyViewModel}">
    <local:MyView/>
</DataTemplate>

затем вы просто вставляете экземпляр модели представления в ContentControl, ItemsControl или что и WPF будет сделать его с соответствующими DataTemplate. Это DataTemplate будет иметь модель представления как его DataContext, в силу системы шаблонов WPF.


Если вы прочитаете комментарии к видео Silverlight, вы увидите, что привязка к ObservableCollection была ошибкой. Это вызывает исключение.

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

пример Kents выше-общее правило, которому я следую, получая Silverlight для создания представления для меня, учитывая коллекцию ViewModels.


У меня была некоторая поддержка от некоторых исключительно одаренных инженеров MS в нашем проекте, и они связывают View datacontext непосредственно с моделью представления.

В идеале у вас не должно быть никакого кода за кодом, кроме вашего контекста данных-infact это можно сделать и в XAML.