Развернуть строку в сетке данных WPF - PullRequest
3 голосов
/ 17 ноября 2011

Я использую DataGrid для отображения некоторых файлов журнала, где каждая ячейка содержит TextBlock.Мне нужна помощь в создании метода для расширения выбранной пользователем строки, например:

http://dl.dropbox.com/u/5649690/StackOverflow%20-%20Do%20not%20delete/Expand%20row%20in%20wpf%20datagrid/Do%20want.png

Это мой код прямо сейчас.Он основан на индексе строки, по которой щелкнули:

DataGridRow testrow = (DataGridRow)logBrowserDataGrid.ItemContainerGenerator.ContainerFromIndex(index);

logBrowserDataGrid.UpdateLayout();
logBrowserDataGrid.ScrollIntoView(logBrowserDataGrid.Items[index]);

testrow = (DataGridRow)logBrowserDataGrid.ItemContainerGenerator.ContainerFromIndex(index);
testrow.Height = 100;

Однако это приводит к странному результату:

http://dl.dropbox.com/u/5649690/StackOverflow%20-%20Do%20not%20delete/Expand%20row%20in%20wpf%20datagrid/Do%20not%20want%20.png

Знаете ли вы божественный способ расширениястрока на основе индекса?

Вы знаете, что происходит в странном результате, который я получаю?Похоже, я расширяю часть ряда, а остальные растягиваются.Я также изучил его во время выполнения и вижу, что его высота равна 100, но ActuallyHeight по-прежнему равен 20.

Дополнительная информация: размер строк по умолчанию устанавливается свойством .RowHeight вDataGrid.Я использую функцию AutoGenerateColumns, а также ловлю событие AutogeneratingColumn, чтобы заменить столбец DataGridTemplateColumn.

Ответы [ 2 ]

4 голосов
/ 17 ноября 2011

Почему бы не заменить DataGridCellTemplate по умолчанию на Expander, чтобы сделать все это за вас?

<DataGridColumn>
    <DataGridColumn.CellTemplate>
        <DataTemplate>
            <Expander Header="{Binding SomeText}">
                <TextBlock TextWrapping="Wrap" Text="{Binding SomeText}" />
            </Expander>
        </DataTemplate>
    </DataGridColumn.CellTemplate>
</DataGridColum>

Если вам не нравится внешний вид Expander по умолчанию, вы можете перезаписать его шаблон, чтобы он выглядел как обычный TextBlock

В качестве примечания, чтобы растянуть и выровнять по вертикали DataGridRow, вы хотите растянуть и выровнять содержимое ячейки, а не строку.

0 голосов
/ 29 ноября 2011

Я попробовал с Expander, и функциональность была именно то, что я хотел, но внешний вид не был, однако. Я попытался рестайлинг Expander, чтобы соответствовать моим потребностям, но отказался из-за событий, которые мне нужно было добавить к нему (события XamlReader + были больше, чем мои навыки программирования могли справиться). Но, основываясь на предложении Рэйчелс, я создал UserControl со следующим содержимым:

<StackPanel Orientation="Vertical" MouseUp="StackPanel_MouseUp">
   <TextBlock Name="headerTextBlock" Margin="3,2,3,2" Height="20" Width="Auto" TextWrapping="NoWrap"/>
   <TextBlock Name="textTextBlock" Margin="3,2,3,2" Height="Auto" Width="Auto" TextWrapping="NoWrap" Visibility="Collapsed"/>
</StackPanel>

В коде позади я могу обработать событие "StackPanel_MouseUp", чтобы изменить видимость TextBlocks. Этот элемент управления выглядит и работает так, как я хотел, чтобы рестайлинговый Expander делал.

Теперь моя строка xaml выглядит следующим образом.

string xamlCellTemplateFormat =
         @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                         xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
                         ~local~>
                <local:CustomExpander x:Name=""UserControlTest"" Header=""{Binding Path=~binding~}"" Text=""{Binding Path=~binding~}""/>
           </DataTemplate>";

string xamlCellTemplate = xamlCellTemplateFormat.Replace("~binding~", e.Column.Header.ToString());
xamlCellTemplate = xamlCellTemplate.Replace("~local~", " xmlns:local=\"clr-namespace:IS.AppFramework.Windows.LogBrowserWPF;assembly=" + Assembly.GetExecutingAssembly().GetName().Name + "\"");
...