Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Выравнивание DataGrid в Expander


Автор: interv 21.10.2013, 09:55
Есть окошко
Код

<Window x:Class="WpfApplication31.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <DataGrid Name="f_DataGrid">
    <DataGrid.RowDetailsTemplate>
      <DataTemplate>
        <Grid>
          <Expander Header="Експандер" 
                    HorizontalContentAlignment="Stretch">
            <DataGrid Name="f_History" 
                      HorizontalAlignment="Stretch">
              <DataGrid.Columns>
                <DataGridTextColumn Width="*" 
                                    Header="ФИО" />
                <DataGridTextColumn Width="*" 
                                    Header="Дата/время"/>
                <DataGridTextColumn Width="3*" 
                                    Header="Действие"/>
              </DataGrid.Columns>
            </DataGrid>
          </Expander>
        </Grid>
      </DataTemplate>
    </DataGrid.RowDetailsTemplate>    
  </DataGrid>
</Window>



в превьюве отображается дрянь (то же и в откомпилиной программе), колонки не растягиваются по ширине таблицы. если у Grid задать фиксированный Width, то все в порядке.

Автор: dzaraev 21.10.2013, 12:46
Я не знаю, что я делаю не так, но у меня всё красиво, воспроизведите проблемы на моём примере, если что.

Автор: interv 21.10.2013, 14:55
Действительно, возможно ошибка глубже.. Будем капать.
Спасибо.

Автор: interv 22.10.2013, 07:38
В общем вот глючная разметка, совсем забыл сказать, DataGrid выступает в виде RowDetailsTemplate у DataGrid'а
Код

<Window x:Class="WpfApplication31.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <DataGrid Name="f_DataGrid">
    <DataGrid.RowDetailsTemplate>
      <DataTemplate>
        <Grid>
          <Expander Header="Експандер" 
                    HorizontalContentAlignment="Stretch">
            <DataGrid Name="f_History" 
                      HorizontalAlignment="Stretch">
              <DataGrid.Columns>
                <DataGridTextColumn Width="*" 
                                    Header="ФИО" />
                <DataGridTextColumn Width="*" 
                                    Header="Дата/время"/>
                <DataGridTextColumn Width="3*" 
                                    Header="Действие"/>
              </DataGrid.Columns>
            </DataGrid>
          </Expander>
        </Grid>
      </DataTemplate>
    </DataGrid.RowDetailsTemplate>    
  </DataGrid>
</Window>



Автор: dzaraev 25.10.2013, 07:23
Всё просто, вы использовали звездочки в значениях DataGridTextColumn.Width. Но такой синтаксис прокатывает только для тех элементов, у которых свойства Height/Width имеют тип http://msdn.microsoft.com/ru-ru/library/vstudio/system.windows.gridlength(v=vs.100).aspx (например классы ColumnDefinition/RowDefinition) и с которыми связан экземпляр http://msdn.microsoft.com/ru-ru/library/vstudio/system.windows.gridunittype(v=vs.100).aspx. 
Вы же используете класс DataGridTextColumn, у которого свойство Width/Height имеет тип double. Wpf знает, как превратить звёздочку * в GridLength, но не знает, как её превратить в double. В итоге во время выполнения ваши колонки получают в свойствах Width значение double.NaN и все колонки оказываются свёрнутыми. 
Что я изменил в вашем примере: значения свойств DataGridTextColumn.Width переставил на Auto - этот синтаксис WPF "понимает" для данного класса. Плюс добавил несколько свойств и данных, просто чтобы увидеть грид "в работе".

Автор: interv 2.12.2013, 08:34
Большое спасибо, но auto не подойдет, мне нужно что-то подобное.
На данный момент перехватываю события изменения колонок родительского DataGrid, и устанавливаю фактическую ширину у Expander по сумме фактических размеров колонок в пикселях.
Вот такой костыль. В инете до сих пор ответа не нашел.
ЗЫ: DataGridTextColumn.Width имеет тип DataGridLength, а вот свойство ActualWidth уже имеет тип Double. Пожалуйста не путайте.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)