在MVVM中绑定DataContext的策略是什么?

时间:2009-04-02 10:22:54

标签: wpf silverlight mvvm conceptual

这两个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 /等。 ?这里有哪些优点,缺点和策略?

任何意见都赞赏。

3 个答案:

答案 0 :(得分:10)

他们是否提到为什么不同的方法用于Silverlight?它可能只是平台的限制。

建议的方法是绝对使用视图模型本身作为视图的DataContext。实际上,您应该创建视图模型并让WPF为您解析视图,而不是显式创建视图。为此,请注册DataTemplate

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

然后,您只需将视图模型实例粘贴到ContentControlItemsControl或其他任何内容中,WPF将使用相应的DataTemplate进行渲染。凭借WPF的模板系统,DataTemplate将视图模型作为其DataContext

答案 1 :(得分:3)

如果你阅读了Silverlight视频的评论,你会发现绑定到ObservableCollection是一个错误。它会导致抛出异常。

大多数情况下,View绑定到ViewModel(事实上我不能想到我不这样做的原因)

上面的Kents示例是我遵循的一般规则,在给定ViewModel集合的情况下让Silverlight为我创建视图。

答案 2 :(得分:1)

我得到了一些有天赋的MS工程师对我们项目的支持,他们将View datacontext直接绑定到View Model。

理想情况下,除了您的数据上下文设置之外,您不应该在代码后面有任何代码 - 事实上,这也可以在XAML中完成。