2011-09-13 70 views
2

考慮下面的簡單代碼:綁定問題ActualWidth的動態填充網格


XAML:

<Grid Height="60" Name="grid"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="162*" /> 
     <ColumnDefinition x:Name="coltest" Width="316*" /> 
     <ColumnDefinition Width="239*" /> 
    </Grid.ColumnDefinitions> 
</Grid> 
<Label MouseDoubleClick="TextBox_MouseDoubleClick" 
    Content="{Binding ElementName=coltest, Path=ActualWidth}" Grid.Row="1"/> 

MouseDoubleClick事件:

private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    grid.RowDefinitions.Add(new RowDefinition()); 
    for (int i = 0; i < grid.ColumnDefinitions.Count; i++) 
    { 
     Random r = new Random(); 
     Label l = new Label { Content = r.Next(10, 1000000000).ToString() }; 
     grid.Children.Add(l); 
     Grid.SetRow(l, grid.RowDefinitions.Count - 1); 
     Grid.SetColumn(l, i); 
    } 
} 

我的標籤通過綁定包含第二列的ActualWidth屬性。在Visual Studio中,我看到包含值316的標籤,所以綁定起作用。

雙擊標籤觸發其事件並向網格添加額外的行,所有行都具有隨機的長度。

我希望在我的標籤上看到一個新的值,但是(在運行時計算)0不會改變!

缺少什麼我在這裏?

回答

4

的主要問題是,ColumnDefinitionActualWidth不是一個依賴項屬性,也沒有實現INotifyPropertyChanged所以Binding無法知道COLTEST的ActualWidth已經改變的方式。

你需要明確地更新Binding

EDIT2:在這種情況下,您可能能夠自Columns*寬度更新BindingSizeChanged事件爲Grid。這不會Auto寬度工作100%,雖然由於寬度將在ColumnDefinition

<Grid Name="grid" 
     SizeChanged="grid_SizeChanged"> 
    <!--...--> 
</Grid> 

事件處理程序更改基於元素

void grid_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    BindingExpression be = label.GetBindingExpression(Label.ContentProperty); 
    be.UpdateTarget(); 
} 

編輯:提出了一些小的改動Xaml。您雙擊第一Label

<Grid Name="grid"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="162*" /> 
     <ColumnDefinition x:Name="coltest" Width="316*" /> 
     <ColumnDefinition Width="239*" /> 
     <ColumnDefinition Width="239*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <Label MouseDoubleClick="TextBox_MouseDoubleClick" 
      Name="label" 
      Content="{Binding ElementName=coltest, Path=ActualWidth}" Grid.Row="0"/> 
</Grid> 

事件處理

private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    grid.RowDefinitions.Add(new RowDefinition()); 
    for (int i = 0; i < grid.ColumnDefinitions.Count; i++) 
    { 
     Random r = new Random(); 
     Label l = new Label { Content = r.Next(10, 1000000000).ToString() }; 
     grid.Children.Add(l); 
     Grid.SetRow(l, grid.RowDefinitions.Count - 1); 
     Grid.SetColumn(l, i); 
    } 
    BindingExpression be = label.GetBindingExpression(Label.ContentProperty); 
    be.UpdateTarget(); 
} 
+0

啊這將更新Binding每次,我明白了。我如何更新綁定?這取決於何時計算ActualWidth屬性的權利? – 321X

+0

你現在正式成爲我的英雄!謝啦! – 321X

+0

當然,很高興我能夠幫助:) –