C# 动态填充网格上的绑定问题实际宽度

C# 动态填充网格上的绑定问题实际宽度,c#,wpf,xaml,binding,actualwidth,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*" />

考虑以下简单代码:


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"/>
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
属性。在VisualStudio中,我看到我的标签包含值316,因此绑定可以工作

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

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


这里我缺少什么?

主要问题是
列定义的
实际宽度
不是依赖属性,也没有实现
INotifyPropertyChanged
,因此
绑定
无法知道coltest的
实际宽度
已更改

您需要显式更新
绑定

Edit2:在这种情况下,您可能能够在
SizeChanged
事件中更新
网格的
绑定
,因为
具有
*
宽度。但是,对于
Auto
width,这不会100%起作用,因为宽度将根据
ColumnDefinition

<Grid Name="grid"
      SizeChanged="grid_SizeChanged">
    <!--...-->
</Grid>
编辑:对Xaml进行了一些小的更改。每次双击第一个
标签

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

事件处理程序

private void TextBox\u MouseDoubleClick(对象发送器,MouseButtonEventArgs e)
{
添加(新的RowDefinition());
对于(int i=0;i
啊,我明白了。如何更新绑定?这取决于什么时候计算ActualWidth属性,对吗?当然,很高兴我能帮上忙:)我实际上不得不听
LayoutUpdated
事件。
SizeChanged
事件仅在初始化时触发。好的,
SizeChanged
事件在
Grid
每次更改大小时都会引发,但是如果您添加一个新的
ColumnDefinition
,例如,
Grid
ColumnDefinitions
大小不会更改,但
Grid
ColumnDefinitions
会更改
LayoutUpdated
在布局的每次更新(大小更改或诸如此类)时都会引发,因此是的,不可能错过那里的更新:)
<Grid Name="grid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="162*" />
        <ColumnDefinition x:Name="coltest" Width="316*" />
        <ColumnDefinition Width="239*" />
        <ColumnDefinition Width="239*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Label MouseDoubleClick="TextBox_MouseDoubleClick"
           Name="label"
           Content="{Binding ElementName=coltest, Path=ActualWidth}" Grid.Row="0"/>
</Grid>
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);
    }
    BindingExpression be = label.GetBindingExpression(Label.ContentProperty);
    be.UpdateTarget();
}