2012-01-25 67 views
9

I次のコードを持っている:私はテキストボックスで列列1の幅の値を参照することが期待ActualSizeが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> 

を私が見ることができるすべては、私がthisthisを見てきました0

ですWPFではなくSilverlightだけに関連していると言われています。

入力ミスが修正されました。また、出力ウィンドウにバインディングの問題が表示されないことに注意してください。私にとって奇妙なのは、それがデザイナーで働いているということです。実行時にのみ動作を停止します。

+0

あなたはタイプミスがあります

この問題を回避するには、列に隠されたコントロールを配置し、それがこのようなActualWidthだと結合することです。"ElementName = Colum1"は "ElementName = Column1"でなければなりません – theartwebreathe

+0

@thewebreathe:いいえ、タイプミスがコードを入力している間に入力されました:( –

答えて

4

これは循環参照ではないでしょうか? "Column1"の幅はTextBoxTextに依存し、のTextは "Column1"の幅に依存します。 "Column1"またはTextBoxのいずれかの幅を明示的に設定しない限り、WPFがこれに対してどのように値を解決できるかはわかりません。

編集

ああ、私はこの問題を参照してください。 ActualWidthdoubleであるため、値が計算されると更新を受け取ることはありません。

TextBoxが占有する領域にダミーコントロールを置き、代わりにActualWidthにバインドする@Robert Levyの提案を使用する必要があります。

+0

これが当てはまる場合は、決して終わらないループが0ではないと思います。 110と同じスペース。 –

+1

ゼロは無限ループを処理するWPFの方法かもしれません。 – devuxer

+0

私はrowheightに変更しようとしました。行がテキストの有無にかかわらず同じ高さを持つため、同じことが起こります。 –

3

あなたは、XAMLのこの行にタイプミスがあります

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

ElementNameはColum1の代わりにCOLUMN1する必要があります。

XAMLの便利な点の1つは、不適切なバインディングを実行した場合でも実行され、XAMLについての不満な点の1つは、不適切なバインドを行った場合でも実行されることです。あなたがテキストボックス自体のActualWidthに特異的に結合する場合

EDIT

、それが列内にある、それだけで正常に動作します。

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

または、より単純に(テキストボックス名には、No要件):

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

いいえ、タイプミスがコードを入力していました。マシン? –

+0

コードは機械で完全に実行されていますが、設計時に実際の列幅が表示されます – Stewbob

+0

設計時のみ、実行時に試してください。私は2008年に1台、2010年にもう1台両方とも問題を再現していますか? –

7

興味深い...

DanMが見つかったとして、それが変更されたとき、あなたが文句を言わないバインディング更新を取得して、ColumnDefinition.ActualWidthは、依存関係プロパティではありません。

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

奇妙なものですが、まずは何か...壊れたものがグリッドの列ですか? –

+0

右。それは働いていますが、もし可能であれば私は別の解決策を望んでいます。そうでなければあなたの応答を正しい答えと記します。 –

関連する問題