这两个1小时的视频逐步展示了如何使用MVVM模式在Silverlight和WPF中构建简单的测验应用程序:
Implementing Model-View-ViewModel in Silverlight
Implementing Model-View-ViewModel in WPF
令我惊讶的是它们在结构上有多么不同,例如,它们如何使用DataBinding:
在Silverlight方法中,我们将 View 的DataContext设置为ViewModel 中的 ObservableCollection :
<views:QuestionView x:Name="QuestionDataView" />
QuestionViewModel qdata = new QuestionViewModel();
qdata.FetchQuestions();
QuestionDataView.DataContext = qdata.Questions;
在WPF方法中,我们将 Window 的DataContext设置为 ViewModel 本身。
<view:QuizView Margin="4" />
base.DataContext = new QuizViewModel(Quiz.Create());
似乎我看到的每个MVVM示例都会在一个稍微新的变体中进行DataContext绑定,并且我试图确定一些坚实的基础,以“如何完成DataContext绑定在MVVM模式中“。
当您决定将DataContext绑定到某个东西时,您会想到什么:为什么将 Window / View / ListBox / etc。的DataContext绑定到 ObservableCollection / ModelView /等。 ?这里有哪些优点,缺点和策略?
任何意见都赞赏。
答案 0 :(得分:10)
他们是否提到为什么不同的方法用于Silverlight?它可能只是平台的限制。
建议的方法是绝对使用视图模型本身作为视图的DataContext
。实际上,您应该创建视图模型并让WPF为您解析视图,而不是显式创建视图。为此,请注册DataTemplate
:
<DataTemplate DataType="{x:Type local:MyViewModel}">
<local:MyView/>
</DataTemplate>
然后,您只需将视图模型实例粘贴到ContentControl
,ItemsControl
或其他任何内容中,WPF将使用相应的DataTemplate
进行渲染。凭借WPF的模板系统,DataTemplate
将视图模型作为其DataContext
。
答案 1 :(得分:3)
如果你阅读了Silverlight视频的评论,你会发现绑定到ObservableCollection是一个错误。它会导致抛出异常。
大多数情况下,View绑定到ViewModel(事实上我不能想到我不这样做的原因)
上面的Kents示例是我遵循的一般规则,在给定ViewModel集合的情况下让Silverlight为我创建视图。
答案 2 :(得分:1)
我得到了一些有天赋的MS工程师对我们项目的支持,他们将View datacontext直接绑定到View Model。
理想情况下,除了您的数据上下文设置之外,您不应该在代码后面有任何代码 - 事实上,这也可以在XAML中完成。