绑定到ColumnDefinition.ActualWidth返回0

时间:2009-09-28 16:17:21

标签: wpf xaml binding grid actualwidth

将其粘贴到Cider中。

<Grid x:Name="Grid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="ColumnDefinition"/>
    </Grid.ColumnDefinitions>
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="{Binding ActualWidth, ElementName=Grid}"/>
        <TextBlock Text="{Binding ActualWidth, ElementName=ColumnDefinition}"/>
    </StackPanel>
</Grid>

现在,运行它。第二个TextBlock显示0,但不应该,对吧?解决办法:

3 个答案:

答案 0 :(得分:6)

不,你没有。实际上,ColumnDefinition确实具有ActualWidth属性。但它既不是DependencyProperty也不是INotifyPropertyChanged实现。因此,在ActualWidth更新时,没有人知道您的目标。

解决方法?为了什么?您始终可以使用ElementName绑定到父FrameworkElement,而该ActualWidth具有您想要的{{1}}。抱歉复杂的短语:)。无法简化。

希望这有帮助。

答案 1 :(得分:3)

ColumnDefinition.ActualWidth属性不是依赖项属性,绑定只会显示它的初始值,即在为布局更新网格之前为0。另一方面,Grid.ActualWidth属性是依赖属性,绑定将随宽度的变化而更新。

答案 2 :(得分:2)

来自the MSDN page

  

添加或删除行或列时,所有ColumnDefinition元素的ActualWidth和所有RowDefinition元素的ActualHeight在调用Measure之前都会变为零。

似乎在以某种方式调用Measure之前绑定了值。尝试强制绑定Mode = OneWay,并在代码中手动检查,以确认此行为。