DataContext="{Binding}" 是什么意思?

23

我想查找一个不是我的项目中HeaderedContentControl中的项来自哪里。这是代码:

        <HeaderedContentControl 
            Content="{Binding Path=Workspaces}"
            ContentTemplate="{StaticResource WorkspacesTemplate}"
            Header="Workspaces"
            Style="{StaticResource MainHCCStyle}" 
            DataContext="{Binding}" // <--- this 
       />

<DataTemplate x:Key="WorkspacesTemplate">
<TabControl 
  IsSynchronizedWithCurrentItem="True" 
  ItemsSource="{Binding}" 
  ItemTemplate="{StaticResource ClosableTabItemTemplate}"
  Margin="4"
  />

那么让我们来看一下:

  1. ContentTemplate属性描述了如何显示项目。
  2. WorkspacesTemplate将ItemsSource的属性设置为{Binding},意味着它绑定到其DataContext属性(HeaderedContentControl的DataContext)
  3. 因此,我查看了HeaderedContentControl的DataContext,但它也被描述为“{Binding}”...

这是什么意思?

2个回答

27

没有看到更多的代码,很难确定,但是 DataContext="{Binding}" 经常是不必要的,因为当前绑定上下文中的任何对象都会自动将其 DataContext 属性设置为等效于 {Binding}

记住:

  • Property="{Binding}" 的意思是“将 this.Property 设置为 this.DataContext 的求值值”
  • Property="{Binding Path=SubProperty}" 的意思是“将 this.Property 设置为 this.DataContext.SubProperty 的求值值”
  • 等等

这意味着 DataContext="{Binding}" 的意思是“将 this.DataContext 设置为 this.DataContext 的求值值”,这在大多数情况下是多余的!


5
“在大多数情况下”这个表达引起了我的兴趣。什么情况下它不是多余的? - Grhm
3
单独来看,我相当确定它总是多余的,但如果包括转换器、更新触发器等,有一些有效的用例可以改变绑定的行为。 - Steve Greatrex
2
最常见的用途是将继承了父级 DataContext 的重写 DataContext 的控件重置回原始值。 - Tom Deloford
2
“重置DataContext”没有意义。 DataContext =“{Binding}”始终是多余的。任何声称知道“有效用例”的人都应该更具体,最好只是展示它。 - Clemens

5

{Binding} 就像绑定'this'或当前数据上下文 - 赋值或从父级继承。为了更好地理解,等价于 {Binding .}{Binding Path=.}


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