有两种不同的方法(至少)来设置DataContext。可以使用XAML或使用代码后置。
哪种是“最佳实践”,为什么?
我倾向于在XAML中设置它,因为它允许设计师自己定义集合,但我需要“弹药”来证明这是最佳实践还是我疯了,代码后置才是爆炸...
有两种不同的方法(至少)来设置DataContext。可以使用XAML或使用代码后置。
哪种是“最佳实践”,为什么?
我倾向于在XAML中设置它,因为它允许设计师自己定义集合,但我需要“弹药”来证明这是最佳实践还是我疯了,代码后置才是爆炸...
第三种方法是使用定位服务。我通常有一个类负责创建所有的DataContext(在我的大多数情况下是VM),并在App.xaml资源中创建该类的实例。然后我在每个单独页面的XAML中绑定DataContext。
例如:
<Page DataContext="{Binding ViewModel,Source={StaticResource Locator}}" >
我认为这取决于您将DataContext设置为什么,最终取决于个人偏好。
个人而言,我总是在视图的代码后台中完成它,因为我发现这样更加清晰,并且这也是我学习MVVM的方式。另一件需要记住的事情是,有时您可能需要根据正在处理的内容更改数据上下文。如果是这种情况,通过代码后台而不是XAML完成会更加清晰/容易。
从目前为止的答案中可以看出,意见存在分歧。 实际上没有最佳实践(我对Silverlight世界中“最佳实践”的讨论感到有点烦恼,它还太年轻了,真正的最佳实践还不得而知。)
事实上,你不能在Xaml中设置“数据上下文”。 除非你像这样构造一个对象实例:
<UserControl>
<UserControl.DataContext>
<local:MyDataProviderThing />
最终,某些外部因素必须直接或间接地通过另一个属性或绑定(如Stephan的回答中所示)来分配DataContext属性。这个外部上下文决定了在Xaml中是否有意义进行操作。许多MVVM解决方案在Xaml中使用绑定,在某些情况下仅仅是为了避免在代码后台中出现任何代码而不是真正变得“更好”。其他人则使用控件派生自的基类在代码中设置DataContext。
用户控件/视图的DataContext吧?在代码后台设置数据上下文的一个优点是可以使用依赖注入。您的DI容器可以在运行时动态地为您处理任何依赖项。
使用这种模式,我经常使用d:DataContext在xaml中设置视图的Blend设计DataContext。 "设计版本"可以提供用于在Blend中使用的模拟数据,而真正的实现则在运行时解决。
DataContext
属性。但是,正如Stephan的答案所示,实际分配的只是一个“绑定”。这本身并不是真正的“数据上下文”。实际分配为“数据上下文”的对象是在ViewModel
属性的代码中执行的,该属性属于分配给名为Locator
的静态资源的对象。 - AnthonyWJones