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

时间:2012-01-25 18:57:15

标签: .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>

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

我见过thisthis,但到处都说这只与Silverlight有关,而不是WPF。

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

3 个答案:

答案 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如何为此解析值。

修改

哦,我看到了问题。 TextBoxTextBox不是依赖项属性,因此在计算值时永远不会收到更新。

您需要使用@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}}" />