在WPF数据网格中展开行

时间:2011-11-17 09:58:53

标签: c# wpf wpfdatagrid

我使用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。

其他信息: 行的默认大小由DataGrid上的.RowHeight属性设置。 我正在使用AutoGenerateColumns功能,并捕获AutogeneratingColumn事件以使用DataGridTemplateColumn替换该列。

2 个答案:

答案 0 :(得分:4)

为什么不用扩展器替换默认的DataGridCellTemplate来为你做所有这些?

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

如果您不喜欢默认的Expander外观,可以将其模板覆盖为纯文本块

作为旁注,要拉伸和垂直对齐DataGridRow,您需要拉伸和对齐单元格内容,而不是行。

答案 1 :(得分:0)

我尝试使用扩展器,功能正是我想要的,但外观并非如此。我已经尝试重新设置Expander来满足我的需要,但是由于我需要添加它的事件而放弃了(XamlReader +事件超出了我的编程技能所能处理的)。但根据Rachels的建议,我使用以下内容制作了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 + "\"");