6

这两个 1 小时的视频分步展示了如何使用 MVVM 模式在 Silverlight 和 WPF 中构建简单的测验应用程序:

在 Silverlight 中实现模型-视图-视图模型

在 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 绑定,我试图确定一些坚实的基础,即“如何在 MVVM 模式中完成 DataContext 绑定”。

当您决定将 DataContext 绑定到某个东西时,您会想到什么:为什么要将Window / View / ListBox / 等的 DataContext 绑定到ObservableCollection / ModelView / 等?这里有什么优点、缺点和策略?

任何输入表示赞赏。

4

3 回答 3

10

他们有没有提到为什么 Silverlight 使用了不同的方法?这可能只是平台的限制。

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

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

然后,您只需将视图模型实例粘贴到ContentControl.ItemsControl或其他任何内容中,WPF 将使用适当的DataTemplate. 凭借 WPF 的模板系统,这DataTemplate将拥有视图模型。DataContext

于 2009-04-02T10:31:23.100 回答
3

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

大多数时候 View 绑定到 ViewModel (实际上我想不出我不这样做的原因)

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

于 2009-04-02T10:49:00.640 回答
1

在我们的项目中,我得到了一些非常有天赋的 MS 工程师的一些支持,他们将视图数据上下文直接绑定到视图模型。

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

于 2009-04-06T11:28:21.143 回答