2009-09-28 8 views
2

Cider에 붙여 넣습니다.ColumnDefinition.ActualWidth에 바인딩하여 0을 반환합니다.

<Grid x:Name="Grid"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition x:Name="ColumnDefinition"/> 
    </Grid.ColumnDefinitions> 
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 
     <TextBlock Text="{Binding ActualWidth, ElementName=Grid}"/> 
     <TextBlock Text="{Binding ActualWidth, ElementName=ColumnDefinition}"/> 
    </StackPanel> 
</Grid> 

이제 실행하십시오. 두 번째 TextBlock은 0을 표시하지만 그렇지 않아야합니다. 해결 방법은 무엇입니까? the MSDN page에서

답변

2

는 : 측정가 호출 될 때까지

추가하거나 행이나 열을 제거, 모든 ColumnDefinition 요소에 대한 ActualWidth 모든 RowDefinition 요소의의 ActualHeight는 제로가된다.

어쨌든 Measure이 호출되기 전에 값이 바인딩 된 것 같습니다. 바인딩에서 Mode = OneWay을 강제 실행하고 코드에서 수동으로 확인하여이 동작을 확인하십시오.

+0

음 : http://msdn.microsoft.com/en-us/library/system.windows.controls.columndefinition.actualwidth.aspx –

5

아니요. ColumnDefinition에는 실제로 ActualWidth 속성이 있습니다. 하지만 DependencyProperty도 아니고 INotifyPropertyChanged 구현도 아닙니다. 따라서 누구도 ActualWidth이 업데이트되면 목표를 알려주지 않습니다.

해결 방법? 무엇 때문에? 항상 ElementName이라는 바인딩을 부모 FrameworkElement에 사용할 수 있습니다. 정확히 ActualWidth을 갖고 있습니다. 복잡한 문구를 유감스럽게 생각합니다 :). 더 간단하게 만들 수는 없었습니다.

희망이 도움이됩니다.

+0

물론 필자는 더 큰 표에서 여러 열 . 이것은 단지 시위 일뿐입니다. – CannibalSmith

1

속성은 종속성 속성이 아니며 레이아웃에 대한 그리드가 업데이트되기 전에 바인딩의 초기 값은 0으로 표시됩니다. 반면에 Grid.ActualWidth 속성은 종속성 속성이며 너비가 변경되면 바인딩이 업데이트됩니다.

관련 문제