在动态填充网格上绑定问题ActualWidth

时间:2011-09-13 14:01:58

标签: c# wpf xaml binding actualwidth

考虑以下简单代码:


XAML:

<Grid Height="60" Name="grid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="162*" />
        <ColumnDefinition x:Name="coltest" Width="316*" />
        <ColumnDefinition Width="239*" />
    </Grid.ColumnDefinitions>
</Grid>
<Label MouseDoubleClick="TextBox_MouseDoubleClick" 
    Content="{Binding ElementName=coltest, Path=ActualWidth}" Grid.Row="1"/>

MouseDoubleClick事件:

private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    grid.RowDefinitions.Add(new RowDefinition());
    for (int i = 0; i < grid.ColumnDefinitions.Count; i++)
    {
        Random r = new Random();
        Label l = new Label { Content = r.Next(10, 1000000000).ToString() };
        grid.Children.Add(l);
        Grid.SetRow(l, grid.RowDefinitions.Count - 1);
        Grid.SetColumn(l, i);
    }
}

我的标签通过绑定包含第二列的ActualWidth属性。在Visual Studio中,我看到我的标签包含值316,因此绑定有效。

双击标签会触发其事件并向网格添加一个额外的行,所有行都具有随机长度。

我希望在我的标签上看到一个新值,但是(在运行时计算)0不会改变!

我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

主要问题是ActualWidth的{​​{1}}不是依赖属性,也没有实现ColumnDefinition所以INotifyPropertyChanged无法知道coltest Binding已发生变化。

您需要明确更新ActualWidth

Edit2:在这种情况下,您可以更新自Binding以来Binding的{​​{1}}事件中的SizeChanged宽度为Grid。虽然宽度会根据Columns

中的元素发生变化,但宽度为*时,这不会100%有效
Auto

事件处理程序

ColumnDefinition

修改:对Xaml进行了一些小改动。每次双击第一个<Grid Name="grid" SizeChanged="grid_SizeChanged"> <!--...--> </Grid>

时,这将更新void grid_SizeChanged(object sender, SizeChangedEventArgs e) { BindingExpression be = label.GetBindingExpression(Label.ContentProperty); be.UpdateTarget(); }
Binding

事件处理程序

Label