我应该在哪里设置DataContext - 后面的代码或xaml?

问题描述:

(老实说,我搜索并阅读所有的“相关的问题”,似乎有关 - 我不希望从别的地方我没有“小姐”这个问题,但在这里不用...)我应该在哪里设置DataContext - 后面的代码或xaml?

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

什么是'最佳实践',为什么?

我倾向于在XAML中设置它,因为它允许设计者自己定义集合,但我需要“弹药”为什么这是最佳实践,或者为什么我疯了,背后的代码是炸弹。

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

我个人总是在我的观点背后的代码中做这件事,因为我发现它总体上更干净,而且是我被教给MVVM的。另外需要记住的是,有时候您可能需要根据自己的工作情况来更改数据环境。如果是这种情况,那么在代码背后而不是在XAML中执行起来要简单得多。

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

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

+0

确定这是我正在寻找的东西...我个人更喜欢将其设置在xaml中。对于我来说,将它设置在后面的代码中会变得棘手,因为你可以*在任何地方设置datacontext,所以有时候回溯'where'是一种痛苦......这更多地沿着'使用单一方式的理由或另一个'我在找...(在这种情况下,混合中的“模拟数据”是'原因') – dovholuk 2010-05-12 12:05:03

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

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

你可以通过答案至今看法不一见。事实上,没有最好的做法(我在我的优雅中获得了有关Silverlight世界中“最佳实践”的说法,它的方式太年轻了,以至于不能真正知道最佳做法。)

事实上,无法在Xaml中设置“数据上下文”。除非你真正构建这样一个对象实例: -

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

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

+0

我很懊恼 - stephan的帖子清楚地显示了(对我来说反正)如何通过xaml设置datacontext,所以你可以澄清你的意思请不要在xaml中设置datacontext?谢谢 – dovholuk 2010-05-12 12:02:25

+1

@dovholuk:注意我使用“in”data context“是的,你可以将一个对象分配给Xaml中的DataContext属性,但是Stephan的回答显示,实际上被分配的是Binding。本身并不是真正的“数据上下文”,分配给“数据上下文”的实际对象是在分配给名为Locator的静态资源的对象的ViewModel属性中的代码中执行的。 – AnthonyWJones 2010-05-12 12:24:29