为什么ActualSize没有在WPF上更新它的值?

Ign*_*cia 9 .net wpf binding

我有以下代码:

<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>
Run Code Online (Sandbox Code Playgroud)

我希望在文本框中看到列Column1的宽度值,但我能看到的只有0.

我已经看到了这个这个,但到处说,仅涉及的Silverlight,WPF没有.

编辑 修正了一个错字.另请注意,"输出"窗口不显示任何绑定问题.对我来说很奇怪的是它在设计师中工作.它仅在运行时停止工作.

Rob*_*evy 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}" />
Run Code Online (Sandbox Code Playgroud)


dev*_*xer 5

这不是循环引用吗?“Column1”的宽度取决于Text您的TextBox,而Text您的TextBox则取决于“Column1”的宽度。我不明白 WPF 如何可能解析此值,除非您明确设置“Column1”或您的TextBox.

编辑

哦,我明白问题所在了。ActualWidth不是double依赖属性,因此在计算值时您将永远不会收到更新。

您需要使用 @Robert Levy 的建议,在您占用的空间中放置一个虚拟控件TextBox,然后绑定到ActualWidth该控件。

  • @SoMoS,“ColumnnDefinition”不是“FrameworkElement”:http://msdn.microsoft.com/en-us/library/system.windows.controls.columndefinition.aspx。它实际上是一个“FrameworkContentElement”,这不是同一件事。这是实际属性的页面 - 它清楚地写着“ActualWidth”的“double”:http://msdn.microsoft.com/en-us/library/system.windows.controls.columndefinition.actualwidth.aspx (2认同)