2013-10-13 35 views
0

我想佈局一個網格,以便它可以有一個動態數量的列,並且每個數據綁定控件都會自動添加到正確的列(根據其索引數據上下文)。Windows Phone:動態添加數據綁定項目中的列控件

想想保齡球框架,雖然通常總是10,但我不想在XAML中定義10列並逐個添加每個框架。我正試圖以編程方式進行。

這裏是我的XAML:

<ItemsControl x:Name="BowlingPlayers" ItemsSource="{Binding Game.Players}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid Margin="0,0,0,20"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="100"/> 
        <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 

       <TextBlock Text="{Binding Name}"/> 

       <ScrollViewer HorizontalScrollBarVisibility="Visible" Grid.Column="1"> 
        <ItemsControl ItemsSource="{Binding Frames}" > 
         <ItemsControl.ItemsPanel> 
          <ItemsPanelTemplate> 
           <Grid Loaded="BowlingGrid_OnLoaded"> 

           </Grid> 
          </ItemsPanelTemplate> 
         </ItemsControl.ItemsPanel> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <Border Height="64" BorderBrush="White" BorderThickness="1" Loaded="BowlingFrame_OnLoaded"> 
            <Grid> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="*"/> 
              <ColumnDefinition Width="*"/> 
             </Grid.ColumnDefinitions> 
             <Grid.RowDefinitions> 
              <RowDefinition Height="*"/> 
              <RowDefinition Height="*"/> 
             </Grid.RowDefinitions> 

             <TextBlock Grid.Column="0" Text="{Binding Ball1}"/> 
             <Border Grid.Column="1" BorderBrush="White" BorderThickness="1,0,0,1"> 
              <TextBlock Text="{Binding Ball2}"/> 
             </Border> 
             <TextBlock Grid.ColumnSpan="2" Grid.Row="1" Text="{Binding Score}"/> 
            </Grid> 
           </Border> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </ScrollViewer> 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

然後在後臺代碼:

private void BowlingGrid_OnLoaded(object sender, RoutedEventArgs e) { 

    var grid = (Grid)sender; 

    if (grid.ColumnDefinitions.Any()) return; 

    var player = grid.DataContext as BowlingPlayer; 

    if (player != null) {     
     // Add columns for each frame 
     foreach (var frame in player.Frames) { 
      grid.ColumnDefinitions.Add(new ColumnDefinition() {Width = new GridLength(1, GridUnitType.Star)}); 
     } 
    } 
} 

private void BowlingFrame_OnLoaded(object sender, RoutedEventArgs e) { 
    var border = (Border) sender; 
    var frame = border.DataContext as BowlingFrame; 
    var presenter = VisualTreeHelper.GetParent(border); 
    var grid = VisualTreeHelper.GetParent(presenter) as Grid; 

    if (grid != null) { 
     var player = grid.DataContext as BowlingPlayer; 

     if (player != null) { 
      var frameIndex = player.Frames.IndexOf(frame); 
      Grid.SetColumn(border, frameIndex + 1);          
     } 
    } 
} 

據「之類的」工作,似乎所有的幀都被放進第一列,而不是各自的專欄索引。

是否有另一種方法可以在沒有在XAML中硬編碼寬度的情況下進行佈局?它可以工作,如果我使用水平的StackPanel並給每個框架(邊框)一個明確的寬度和高度,但我希望它縮放到可用寬度。

基本上,一個CSS3 flexbox等效的佈局。

回答

相關問題