簡體   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