我应该在哪里设置DataContext - 代码隐藏或xaml?

时间:2010-05-11 14:21:41

标签: wpf silverlight datacontext

(老实说,我搜索并阅读了所有似乎相关的“相关问题” - 我希望我没有“错过”来自其他地方的这个问题,但这里有......)

设置DataContext有两种不同的方式(至少)。可以使用XAML,也可以使用后面的代码。

什么是'最佳做法'以及为什么?

我倾向于赞成在XAML中设置它,因为它允许设计师自己定义集合,但我需要'弹药'来解释为什么它是最佳实践或为什么我疯了,背后的代码是炸弹......

4 个答案:

答案 0 :(得分:4)

您可能会看到的第三种方法是使用定位器服务。我通常有一个类负责创建我的所有DataContext(在大多数情况下我都是VM),我在App.xaml Resources中创建了该类的实例。然后我将DataContext绑定到每个页面的XAML中。

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

答案 1 :(得分:2)

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

我个人总是在我的观点背后的代码中这样做,因为我发现它整体更清洁,这就是我教MVVM的方式。要记住的另一件事是,有时您可能需要根据您正在使用的内容更改您的datacontext。如果是这种情况,那么在后面的代码中而不是在XAML中更清晰/更容易。

答案 2 :(得分:1)

正如你所看到的那样,到目前为止,意见分歧。事实上,没有最佳实践(我确实在我的bonet中得到关于Silverlight世界中“最佳实践”的讨论,因为它太年轻,不能让最佳实践真正为人所知。)

实际情况是,您无法在Xaml中设置“数据上下文”。除非您实际构造这样的对象实例: -

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

最终外部的东西必须直接或通过另一个属性或通过绑定(如Stephan的答案)间接分配DataContext属性。它的这个外部环境决定了在Xaml中是否有意义。许多MVVM解决方案在Xaml中使用绑定,在某些情况下只是为了避免在代码隐藏中根本不需要任何代码而不是真正“更好”。其他人使用您的控件派生的基类在代码中设置DataContext。

答案 3 :(得分:0)

用户控件/视图的DataContext我假设?在后面的代码中设置数据上下文的一个优点是依赖注入的可用性。您的DI容器可以在运行时动态处理任何依赖关系。

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