[英]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.