2012-01-25 8 views
9

tengo el siguiente código:¿Por qué ActualSize no actualiza su valor en WPF?

<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> 

que esperaba ver en el cuadro de texto el valor de la anchura de la columna de la columna 1, pero todo lo que puedo ver es 0.

que he visto this y this pero en todas partes dice que está relacionado solo con Silverlight, no con WPF.

Editar Se corrigió un error tipográfico. También tenga en cuenta que la ventana Salida no muestra ningún problema de enlace. Lo que me resulta extraño es que está funcionando en el diseñador. Deja de funcionar solo en tiempo de ejecución.

+0

Usted tiene un error tipográfico."ElementName = Colum1" debería ser "ElementName = Column1" – theartwebreathe

+0

@theartwebreathe: no, el error tipográfico se ingresó al poner el código en SO :( –

Respuesta

4

No sería esto una referencia circular? El ancho de "Columna1" depende del Text de su TextBox, y el Text de su TextBox depende del ancho de "Columna1". No veo cómo WPF podría alguna vez resolver un valor para esto a menos que establezca explícitamente el ancho de "Columna1" o su TextBox.

Editar

Oh, veo el problema. ActualWidth es un double no una propiedad de dependencia, por lo que nunca recibirá una actualización cuando se calcule el valor.

Tienes que utilizar la sugerencia de @Robert Levy de poner un control ficticio en el espacio ocupado por tu TextBox y vincularlo al ActualWidth de eso en su lugar.

+0

Si ese fuera el caso, esperaría un ciclo interminable no 0. De todos modos, el texto 100 necesita el mismo espacio que 110. –

+1

El cero puede ser el modo de WPF de tratar con el bucle infinito. – devuxer

+0

He intentado cambiar al rowheight y sucede lo mismo, así que parece que esto no es lo que está sucediendo porque la fila tiene la misma altura con o sin texto. –

3

Usted tiene un error tipográfico en esta línea de XAML:

<TextBox Grid.Column="0" Text="{Binding ActualWidth,ElementName=Colum1,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" /> 

ElementName debería ser Columna1 en lugar de Colum1.

Una de las cosas buenas de XAML es que aún se ejecutará si ha realizado una vinculación incorrecta, y una de las cosas frustrantes de XAML es que aún se ejecutará si ha realizado una vinculación incorrecta.

EDITAR

Si se asocie a la ActualWidth de la propia caja de texto, es decir dentro de la columna, que funcionará muy bien.

<TextBox Name="tbk1" Grid.Column="0" Text="{Binding ElementName=tbk1, Path=ActualWidth, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" /> 

o, más simplemente (sin necesidad de nombrar el cuadro de texto):

<TextBox Grid.Column="0" Text="{Binding Path=ActualWidth, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource Self}}" /> 
+0

No, el error tipográfico ingresaba el código en SO :(¿Puedes probar el código en tu máquina? –

+0

Código funciona perfectamente en mi máquina con el error tipográfico. Muestra el ancho real de la columna, incluso en el momento del diseño – Stewbob

+0

Sólo en el momento del diseño, intente en tiempo de ejecución, por favor. Tengo dos máquinas, una con 2008 y otra con 2010 y ambos reproducen el problema ¿? –

7

Interesante ...

Como DanM encontró, ColumnDefinition.ActualWidth no es una propiedad de dependencia por lo que no conseguirá actualizaciones vinculantes cuando cambia.

Una solución consiste en poner un control oculto en la columna y se unen a su ActualWidth así:

<ContentControl Visibility="Hidden" Grid.Column="0" HorizontalAlignment="Stretch" x:Name="hidden"/> 
    <TextBox Grid.Column="0" Text="{Binding ActualWidth,ElementName=hidden,Mode=OneWay}" /> 
+0

Extraño, pero es algo para empezar ... ¿así que lo que está roto es la columna Cuadrícula? –

+0

Derecha. Está funcionando, pero preferiría otra solución, si no, marcaré su respuesta como la respuesta correcta. –

Cuestiones relacionadas