繁体   English   中英

绑定到子代在运行时不起作用

[英]Binding to Children does not work at run-time

我将“ Canvas高度”绑定到第一个孩子的高度,以便可以正确地布局它,例如布局:

<StackPanel>
    <Canvas Height="{Binding Children[0].ActualHeight , RelativeSource={RelativeSource Self}}">
        <Rectangle Height="100" Width="100" Fill="Red" />
    </Canvas>
    <TextBlock Text="Text" />
</StackPanel>

不绑定Canvas.Height值为0 ,因此绑定时“文本”重叠-文本位于设计器中 (您可以自己尝试)。

但是,在运行时绑定失败,并且文本重叠。

System.Windows.Data错误:17:无法从“儿童”(类型“ UIElementCollection”)获取“ Item []”值(类型“ UIElement”)。 BindingExpression:Path = Children [0] .ActualHeight; DataItem ='Canvas'(Name =''); 目标元素是'Canvas'(Name =''); 目标属性为'Height'(类型为'Double')ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException:指定的参数超出有效值范围。

为什么? 我可以在运行时具有设计时行为吗?

我想给孩子一个x:Name ,并使用绑定ElementName


这是更好的MCVE:

<ListBox>
    <TextBlock Text="1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1" />
    <TextBlock Text="2" />
    <TextBlock Text="3" />
    <Canvas Height="100">
        <TextBlock Canvas.Left="{Binding HorizontalOffset, RelativeSource={RelativeSource AncestorType=ScrollViewer}}"
                   Text="Frozen" />
    </Canvas>
    <TextBlock Text="4" />
    <TextBlock Text="5" />
</ListBox>

它是这样的:

"Frozen"停留在屏幕上,不考虑水平滚动,而仍被视为一项(垂直滚动可将其移离视图)。 由于Canvas属性的缘故,这是可以实现的:高度和宽度为0 ,并且对布局没有任何影响。 注意绑定到HorizontalOffset

Height="{Binding Children[0].ActualHeight, RelativeSource={RelativeSource Self}}"替换Height="100" Height="{Binding Children[0].ActualHeight, RelativeSource={RelativeSource Self}}" 它可以在设计器中工作,但不能在运行时使用!

作为@MartinZikmund评论

问题是,运行时的绑定是在子项实际存在之前进行评估的

第二个例子可以改写成

<Canvas>
    <TextBlock Canvas.Left="{Binding HorizontalOffset, RelativeSource={RelativeSource AncestorType=ScrollViewer}}"
               Text="Frozen" />
    <Canvas.Height>
        <Binding Path="Children[0].ActualHeight" RelativeSource="{RelativeSource Self}" />
    </Canvas.Height>
</Canvas>

Height绑定内容之后设置。 这使其在运行时工作。

仍然是为什么设计师时间没有问题的问题。 我猜有些wpf魔术。

您可以将这种行为:

private void Canvas_Loaded(object sender, RoutedEventArgs e)
{
    (sender as Canvas)?.SetBinding(Canvas.HeightProperty, new Binding("Children[0].ActualHeight") { RelativeSource=new RelativeSource { Mode= RelativeSourceMode.Self } });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM