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