考虑下面的简单代码:
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不会改变!
我在这里想念什么?
最佳答案
主要问题是ActualWidth
的ColumnDefinition
不是依赖项属性,也不实现INotifyPropertyChanged
,因此Binding
无法知道比赛的ActualWidth
已更改。
您需要显式更新Binding
Edit2:在这种情况下,由于Binding
的宽度为SizeChanged
,因此您可以在Grid
事件中为Columns
更新*
。尽管Auto
宽度不能100%起作用,因为宽度会根据ColumnDefinition
中的元素而变化
<Grid Name="grid"
SizeChanged="grid_SizeChanged">
<!--...-->
</Grid>
事件处理程序
void grid_SizeChanged(object sender, SizeChangedEventArgs e)
{
BindingExpression be = label.GetBindingExpression(Label.ContentProperty);
be.UpdateTarget();
}
编辑:对Xaml进行一些小的更改。每次双击第一个
Binding
都会更新Label
<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();
}