gpt4 book ai didi

c# - 动态填充网格上的绑定(bind)问题 ActualWidth

转载 作者:行者123 更新时间:2023-11-30 21:12:34 26 4
gpt4 key购买 nike

考虑以下简单代码:


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

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

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

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

我在这里错过了什么?

最佳答案

主要问题是ActualWidthColumnDefinition不是依赖属性,也没有实现 INotifyPropertyChanged所以 Binding无法知道 ActualWidth coltest 已更改。

您需要显式更新 Binding

Edit2:在这种情况下,您可以更新 BindingSizeChanged Grid 的事件自 Columns*宽度。这不会 100% 与 Auto 一起工作宽度,因为宽度会根据 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();
}

关于c# - 动态填充网格上的绑定(bind)问题 ActualWidth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7403151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com