我应该在代码后台还是XAML中设置DataContext?

11

有两种不同的方法(至少)来设置DataContext。可以使用XAML或使用代码后置。

哪种是“最佳实践”,为什么?

我倾向于在XAML中设置它,因为它允许设计师自己定义集合,但我需要“弹药”来证明这是最佳实践还是我疯了,代码后置才是爆炸...

4个回答

5

第三种方法是使用定位服务。我通常有一个类负责创建所有的DataContext(在我的大多数情况下是VM),并在App.xaml资源中创建该类的实例。然后我在每个单独页面的XAML中绑定DataContext。

例如:

<Page DataContext="{Binding ViewModel,Source={StaticResource Locator}}" >

2

我认为这取决于您将DataContext设置为什么,最终取决于个人偏好。

个人而言,我总是在视图的代码后台中完成它,因为我发现这样更加清晰,并且这也是我学习MVVM的方式。另一件需要记住的事情是,有时您可能需要根据正在处理的内容更改数据上下文。如果是这种情况,通过代码后台而不是XAML完成会更加清晰/容易。


1

从目前为止的答案中可以看出,意见存在分歧。 实际上没有最佳实践(我对Silverlight世界中“最佳实践”的讨论感到有点烦恼,它还太年轻了,真正的最佳实践还不得而知。)

事实上,你不能在Xaml中设置“数据上下文”。 除非你像这样构造一个对象实例:

<UserControl>
  <UserControl.DataContext>
    <local:MyDataProviderThing />

最终,某些外部因素必须直接或间接地通过另一个属性或绑定(如Stephan的回答中所示)来分配DataContext属性。这个外部上下文决定了在Xaml中是否有意义进行操作。许多MVVM解决方案在Xaml中使用绑定,在某些情况下仅仅是为了避免在代码后台中出现任何代码而不是真正变得“更好”。其他人则使用控件派生自的基类在代码中设置DataContext。


我有点困惑 - Stephan的帖子很清楚地展示了如何通过XAML设置数据上下文,所以当你说你不能在XAML中设置数据上下文时,你能澄清一下你的意思吗?谢谢。 - dovholuk
1
@dovholuk:请注意我的“数据上下文”中使用的引号。是的,您可以在Xaml中将对象分配给DataContext属性。但是,正如Stephan的答案所示,实际分配的只是一个“绑定”。这本身并不是真正的“数据上下文”。实际分配为“数据上下文”的对象是在ViewModel属性的代码中执行的,该属性属于分配给名为Locator的静态资源的对象。 - AnthonyWJones

0

用户控件/视图的DataContext吧?在代码后台设置数据上下文的一个优点是可以使用依赖注入。您的DI容器可以在运行时动态地为您处理任何依赖项。

使用这种模式,我经常使用d:DataContext在xaml中设置视图的Blend设计DataContext。 "设计版本"可以提供用于在Blend中使用的模拟数据,而真正的实现则在运行时解决。


确定这就是我要找的东西...我个人更喜欢在XAML中设置它。对我来说,在代码后面设置它变得棘手,因为你可以在“任何地方”设置数据上下文,所以有时候追踪“哪里”是很痛苦的...这更符合我寻找的“使用单向或双向绑定的原因”的类型...(在这种情况下,在Blend中的“模拟数据”是“原因”) - dovholuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接