Каковы ваши стратегии привязки 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.