【发布时间】:2018-03-21 09:06:54
【问题描述】:
我在 WPF 中读到的关于 MVVM 的大部分内容都是关于通过以某种方式将视图的 DataContext 设置为视图模型的实例来将视图连接到视图模型。我不喜欢使用 DataContext,因为它没有输入,因此智能感知不起作用。
我正在考虑使用一种方法,其中视图具有一个名为 ViewModel 的属性,该属性设置为该属性的一个实例。由于此属性具有特定类型,因此我可以像这样绑定到视图模型的属性
<TextBlock Text="{Binding Path=ViewModel.Property1, ElementName=_viewWindow}"/>
其中 _viewWindow 是应用于视图类的名称(例如可以是 Window 或 UserControl)。虽然这比通过 DataContext 绑定要冗长一些,但它的优点是智能感知可以工作。
视图模型将实现 INotifyPropertyChanged。
这是一种有效的方法吗?在我读过的关于 MVVM 的任何文章中,我都没有看到任何对这种方法的引用,但这似乎是一个合理的想法。
除了更短的绑定语法之外,使用 DataContext 还有其他优点吗?
我在另一个答案中看到的一件事是添加一个将 DataContext 转换为视图模型类型的属性。
【问题讨论】:
-
你会从哪里得到
INotifyPropertyChanged? -
ViewModel 将实现
INotifyPropertyChanged。我认为数据绑定更新应该适用于这种方法。 -
为顶级元素设置的DataContext被所有子元素继承。它确实缩短了绑定路径。如果您需要 Intellisense 支持,请查看d:DataContext / d:DesignInstance example 1、d:DataContext / d:DesignInstance example 2
-
@ASh - 这是一个有趣的想法,我用它做了一些实验。 Intelisense 将显示我的视图模型的属性,但也会显示许多其他属性。如果我键入视图模型上不存在的属性,它也不会标记错误。它还要求我的视图模型具有默认构造函数。使用我上面描述的方法,检查似乎更加严格。所以
DataContext的主要优势似乎是我视图控制树下任何位置的短路径语法? -
" 它还要求我的视图模型有一个默认构造函数" - 不是真的,如果没有默认 ctor,请设置
IsDesignTimeCreatable=False。 “如果我键入视图模型上不存在的属性,它不会标记错误” - 它对我有用。即使在 VS 2010 中。