为什么 WPF 绑定在绑定到元素本身的标签时不起作用
Why WPF binding not work when bound to a tag of element itself
对于初始版本,一切都很好:
<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实现一个异步值转换器,所以我需要执行所谓的两步转换。
你必须知道 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
这个名字现在更有意义了。
对于初始版本,一切都很好:
<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实现一个异步值转换器,所以我需要执行所谓的两步转换。
你必须知道 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
这个名字现在更有意义了。