绑定到 ElementName 取决于绑定顺序

Binding to ElementName depends on binding order

我创建了简单的 StateTrigger 来绑定到 FrameworkElement Width 属性。共有三个依赖属性:MinValueMaxValueElement。它们的类型分别是 doubledoubleFrameworkElement

而且我注意到,根据绑定顺序,它可能有效也可能无效。

这很好用。

<local:ElementWidthTrigger MaxValue="1000"
                           MinValue="800"
                           Element="{Binding ElementName=LayoutRoot}" />

这不是。

<local:ElementWidthTrigger Element="{Binding ElementName=LayoutRoot}"
                           MaxValue="1000"
                           MinValue="800" />

注意到这两个示例的唯一区别是 Element 属性 绑定顺序。

ElementWidthTrigger 中,每个依赖项 属性 都有 属性 更改的回调。当 Element 位于最顶部时,无论如何都不会调用它的回调。

x:Bind 解决了这个问题,无论使用什么顺序,但问题仍然存在。谁能解释为什么 Element 属性 无法根据绑定顺序进行绑定?

运行 Windows 10 1803 build 17134.320.

可以找到工作示例项目 here

哇,这真是个谜!虽然我无法找出问题的原因,但它确实看起来像是 UWP 中的一个错误。我注意到将 x:Name 添加到 VisualStates 中的一个的简单操作将使 ElementName-一阶工作按预期进行:

<VisualState x:Name="Test">
    <VisualState.StateTriggers>
        <local:ElementWidthTrigger Element="{Binding ElementName=LayoutRoot}"
                                   MaxValue="1000"
                                   MinValue="800" />
    </VisualState.StateTriggers>

    <VisualState.Setters>
        <Setter Target="Rectangle.Fill" Value="Blue" />
    </VisualState.Setters>
</VisualState>

如果 UWP 团队的某个人看到并提供帮助,那就太好了,因为它可能需要深入了解内部结构才能理解正在发生的事情。

感谢您报告此问题并提供可靠的重现项目 - 这是一个平台错误。我已将其记录在我们的数据库中并分配给正确的团队。再次感谢!