【问题标题】:What are your strategies of binding the DataContext in MVVM?您在 MVVM 中绑定 DataContext 的策略是什么?
【发布时间】:2010-10-17 02:05:14
【问题描述】:

这两个 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 / etc。 ?这里有什么优点、缺点和策略?

任何意见表示赞赏。

【问题讨论】:

  • “在 Silverlight 中实现模型-视图-视图模型”视频太糟糕了。 Tim Heuer 创建了一个存储库并将其称为 ViewModel。 Josh Smith 的 WPF 视频要好得多。他实际上知道他在说什么。

标签: wpf silverlight mvvm conceptual


【解决方案1】:

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

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

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

然后,您只需将视图模型实例粘贴到 ContentControlItemsControl 或其他任何内容中,WPF 就会使用适当的 DataTemplate 呈现它。凭借 WPF 的模板系统,DataTemplate 将拥有视图模型作为其DataContext

【讨论】:

  • 又一个变体,很好,当你说“你应该”时,你的意思是某处有 MVVM 指导吗?我认为绑定实际上应该放入代码中,以便以后可以将其换出,例如在运行时,否则您的视图(在 XAML 中)与您的 ViewModel 紧密耦合,对吗?
  • 那个特定的数据模板是紧密耦合的,是的,但是数据模板集可以在 WPFs 资源系统中交换进出,因此它成为一个有争议的问题。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您指出这一点,引用评论:“经验法则是 DataContext 应该设置为 ViewModel,并且所有数据元素都应该通过该对象的属性获取。”有道理。
  • 是的,我认为 View 应该绑定到 ViewModel,但在 WPF 示例中,他将包含 View 的 WINDOW 绑定到 ViewModel,并以某种方式使用相同的语法“Binding Path=QuizName”来访问属性,那么 Datacontext 绑定在可视化树的哪个位置无关紧要?
  • 它在找到数据上下文的那一刻上升并停止。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 2015-06-05
    • 2010-09-30
    • 2011-12-21
    • 2021-08-29
    • 2011-02-03
    • 2012-05-26
    • 2018-11-14
    相关资源
    最近更新 更多