Синхронизировать высоту строк в пользовательской сетке данных wpf - PullRequest
1 голос
/ 01 февраля 2012

Я хочу визуально представить мои данные в столбцах, а не в виде представления строки в DataGrid.Вы можете представить мои данные как List<Column>, где столбец содержит List<Cell>.Причина, по которой я не транспонирую данные и просто использую DataGrid, заключается в том, что я хочу иметь возможность динамически добавлять / удалять столбцы без необходимости обрабатывать все данные.

+--------------------------------------------+  
|            | 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.Есть ли способ обеспечить выравнивание всех строк?

Кроме того, это кажется хорошим решением проблемы или есть лучшая альтернатива?

1 Ответ

0 голосов
/ 02 февраля 2012

Вы должны иметь возможность использовать Grid.IsSharedSizeScope , чтобы ваши строки имели общий размер.

В прошлом я использовал его для создания несвязанных столбцов одинакового размера, и нет никаких причин, по которым его нельзя использовать и для строк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...