为什么 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>

但是我把ContentPresenterContent绑定到元素的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实现一个异步值转换器,所以我需要执行所谓的两步转换。

你必须知道 ContentPresenterDataContextContent 值。因此,第二个示例中的 Binding 的行为与您预期的不同(不同的 Binding.Source)。

在您的第二个示例中,您将 ContentPresenter.Content 设置为绑定到它自己的 ContentPresenter.Tag 属性。这使得 ContentPresenter.Tag 成为 ContentPresenterDataContext。现在 Tag 属性 上的 BindingContentPresenter.Tag 作为 Binding 源(DataContext)而不是父元素的 DataContext.

如果你想做你正在做的事情,你应该用 ContentControl 替换 ContentPresenterContentControl 不会改变其 DataContext.

ContentPresenter 主要设计用于 ContentControlControlTemplate,其中 ContentPresenter 自动绑定到父 ContentControl.Content 属性。展示者 对内容(呈现)感兴趣,而不是 DataContext 父控件。这就是 ContentPresenter 对其 DataContext 有这种特殊行为的原因。也许 ContentPresenter 这个名字现在更有意义了。