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

请考虑以下简单代码:


XAML:

        

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不会改变!

我在这里想念的是什么?

主要问题是ColumnDefinition ActualWidth不是依赖属性,也没有实现INotifyPropertyChanged因此Binding无法知道coltest的ActualWidth已经改变。

您需要显式更新Binding

Edit2:在这种情况下,您可能能够更新GridSizeChanged事件中的Binding ,因为Columns具有* width。 尽管宽度将根据ColumnDefinition的元素而改变,但这对于Auto宽度不起作用100%

    

事件处理程序

 void grid_SizeChanged(object sender, SizeChangedEventArgs e) { BindingExpression be = label.GetBindingExpression(Label.ContentProperty); be.UpdateTarget(); } 

编辑:对Xaml做了一些小改动。 每次双击第一个Label这将更新Binding

             

事件处理程序

 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(); }