【问题标题】: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实现一个异步值转换器,所以需要进行所谓的两步转换。

【问题讨论】:

    标签: c# wpf mvvm data-binding


    【解决方案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 这个名字现在更有意义了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-16
      • 2011-01-16
      • 1970-01-01
      • 2018-02-04
      • 2016-04-10
      • 2011-09-29
      • 2022-11-20
      • 1970-01-01
      相关资源
      最近更新 更多