为啥 WPF 绑定在绑定到元素本身的标签时不起作用
Posted
技术标签:
【中文标题】为啥 WPF 绑定在绑定到元素本身的标签时不起作用【英文标题】:Why WPF binding not work when bound to a tag of element itself为什么 WPF 绑定在绑定到元素本身的标签时不起作用 【发布时间】:2022-01-11 00:48:37 【问题描述】:对于初始版本,一切都很好:
<ContentPresenter>
<ContentPresenter.Content>
<MultiBinding Converter="StaticResource WhateverConverter">
<Binding/>
<Binding Path="DummyObject"/>
</MultiBinding>
</ContentPresenter.Content>
</ContentPresenter>
但是在我将ContentPresenter
的Content
绑定到元素的Tag
之后,就不行了,不知道为什么会这样。
<ContentPresenter Content="Binding Path=Tag, RelativeSource=RelativeSource Self">
<ContentPresenter.Tag>
<MultiBinding Converter="StaticResource WhateverConverter">
<Binding/>
<Binding Path="DummyObject"/>
</MultiBinding>
</ContentPresenter.Tag>
</ContentPresenter>
PS:我是用NotifyTask实现一个异步值转换器,所以需要进行所谓的两步转换。
【问题讨论】:
【参考方案1】:您必须知道ContentPresenter
的DataContext
是Content
值。因此,第二个示例中的Binding
的行为与您预期的不同(不同的Binding.Source
)。
在第二个示例中,您将 ContentPresenter.Content
设置为绑定到它自己的 ContentPresenter.Tag
属性。这使得ContentPresenter.Tag
成为ContentPresenter
的DataContext
。现在 Tag
属性上设置的 Binding
具有 ContentPresenter.Tag
作为 Binding
源 (DataContext
) 而不是父元素的 DataContext
。
如果你想做你正在做的事情,你应该用ContentControl
替换ContentPresenter
。 ContentControl
不会改变它的DataContext
。
ContentPresenter
主要设计用于ContentControl
的ControlTemplate
内部,其中ContentPresenter
自动绑定到父ContentControl.Content
属性。参与者仅对内容感兴趣(以呈现它)而不是父控件的DataContext
。这就是ContentPresenter
对其DataContext
具有这种特殊行为的原因。也许ContentPresenter
这个名字现在更有意义了。
【讨论】:
以上是关于为啥 WPF 绑定在绑定到元素本身的标签时不起作用的主要内容,如果未能解决你的问题,请参考以下文章
WPF - 在 DataGrid 中绑定 SolidColorBrush 不起作用