2012-01-31 32 views
1

我想直觀地表示列中的數據,而不是DataGrid的行表示。您可以將我的數據視爲List<Column>,其中列包含List<Cell>。我不轉置數據並僅使用DataGrid的原因是我希望能夠動態添加/刪除列,而無需處理所有數據。在自定義wpf數據網格中同步行高

+--------------------------------------------+ 
|   | Col Header | Col Header | ... | 
| Row Header | Cell | Cell  | ... | 
| ...  |  ... | ...  | ... | 
+--------------------------------------------+ 

我有XAML的樣本是幾乎沒有什麼我想:

<StackPanel Orientation="Horizontal"> 
    <StackPanel Orientation="Vertical" VerticalAlignment="Top"> 
     <TextBox Text="" IsReadOnly="True" BorderThickness="0" HorizontalAlignment="Stretch"/> 
     <TextBox Text="" IsReadOnly="True" BorderThickness="0,0,0,2" BorderBrush="Black" HorizontalAlignment="Stretch"/> 
     <ItemsControl ItemsSource="{Binding RowHeaders}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Vertical"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBox Text="{Binding Mode=OneWay}" IsReadOnly="True" BorderThickness="0,0,2,2" BorderBrush="Black" FontWeight="Bold" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </StackPanel> 
    <ItemsControl ItemsSource="{Binding Columns}"> 
     <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical" > 
       <TextBox Text="{Binding ColHead1, Mode=OneWay}" IsReadOnly="True" BorderThickness="0" FontWeight="Bold" HorizontalAlignment="Stretch"/> 
       <TextBox Text="{Binding ColHead2, Mode=OneWay}" IsReadOnly="True" FontWeight="Bold" BorderThickness="0,0,0,2" BorderBrush="Black" HorizontalAlignment="Stretch"/> 
       <ItemsControl ItemsSource="{Binding Cells}"> 
        <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Vertical" /> 
        </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
        <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <TextBox x:Name="textBox" Text="{Binding}" IsReadOnly="{Binding IsReadOnly}" BorderThickness="0,0,0,2" BorderBrush="Black" HorizontalAlignment="Stretch"/> 
        </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </StackPanel> 
     </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</StackPanel> 

但是,我怎麼能保證我行始終是對齊的?由於列中的單元格包含在單個ItemsControl中,因此保證它們是對齊的。但是,每個列都位於自己的StackPanel內。有沒有辦法確保所有的行都對齊?

此外,這似乎是一個很好的解決方案,或者是否有更好的選擇?

+0

您應該能夠使用[Grid.IsSharedSizeScope](HTTP ://msdn.microsoft.com/en-us/library/system.windows.controls.grid.issharedsizescope.aspx)使您的行共享一個大小。過去我曾經使用過列,但沒有理由它不能用於行。 – Rachel 2012-02-01 04:12:26

+0

@Rachel這實際上有幫助。添加它作爲答案,以便我可以接受它。謝謝。 – Rado 2012-02-01 19:44:05

+0

完成,謝謝:) – Rachel 2012-02-01 20:38:30

回答

0

您應該可以使用Grid.IsSharedSizeScope使您的行共享一個大小。

我用它在過去製造無關聯的列相同的大小,而且也沒有理由不能用於行以及