我有以下代码:
<Window x:Class="UnderstandSizing.Window2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window2" Height="300" Width="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" x:Name="Column1" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBox Grid.Column="0" Text="{Binding ActualWidth,ElementName=Column1,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</Window>
我希望在文本框中看到列Column1的宽度值,但我能看到的只有0。
我见过this和this,但到处都说这只与Silverlight有关,而不是WPF。
修改 修正了一个错字。另请注意,“输出”窗口不显示任何绑定问题。对我来说很奇怪的是它在设计师中工作。它仅在运行时停止工作。
答案 0 :(得分:7)
...有趣
正如DanM发现的那样,ColumnDefinition.ActualWidth不是依赖属性,所以当它更改时你不会得到绑定更新。
解决方法是在列中放置一个隐藏控件并将其绑定到它的ActualWidth,如下所示:
<ContentControl Visibility="Hidden" Grid.Column="0" HorizontalAlignment="Stretch" x:Name="hidden"/>
<TextBox Grid.Column="0" Text="{Binding ActualWidth,ElementName=hidden,Mode=OneWay}" />
答案 1 :(得分:4)
这不是循环参考吗? “Column1”的宽度取决于Text
的{{1}},TextBox
的{{1}}取决于“Column1”的宽度。除非您明确设置“Column1”或Text
的宽度,否则我看不到WPF如何为此解析值。
修改强>
哦,我看到了问题。 TextBox
是TextBox
不是依赖项属性,因此在计算值时永远不会收到更新。
您需要使用@Robert Levy的建议,即在您的ActualWidth
占用的空间中放置一个虚拟控件,并将其绑定到double
。
答案 2 :(得分:3)
你在这行XAML中有一个错字:
<TextBox Grid.Column="0" Text="{Binding ActualWidth,ElementName=Colum1,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" />
ElementName
应为Column1而不是Colum1。
关于XAML的一个好处是,如果你做了一个不正确的绑定它仍会运行,而关于XAML的一个令人沮丧的事情是,如果你做了不正确的绑定,它仍会运行。
修改强>
如果你绑定到文本框本身的ActualWidth,那就是在列中,它可以正常工作。
<TextBox Name="tbk1" Grid.Column="0" Text="{Binding ElementName=tbk1, Path=ActualWidth, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
或更简单(无需命名文本框):
<TextBox Grid.Column="0" Text="{Binding Path=ActualWidth, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource Self}}" />