为啥 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>

但是在我将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实现一个异步值转换器,所以需要进行所谓的两步转换。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于为啥 WPF 绑定在绑定到元素本身的标签时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WPF - ListView 为空时不显示上下文菜单

WPF - 在 DataGrid 中绑定 SolidColorBrush 不起作用

WPF双向绑定不起作用

ISO处理jq事件

WPF 与 StringFormat 的绑定在 ToolTips 上不起作用

C# WPF - Listview 绑定不起作用