【发布时间】:2010-10-25 22:27:04
【问题描述】:
我需要对嵌套在TabControl 中的DataGrid 中的行应用分组。 DataGrid 和 TabControl 都是数据绑定的。最外层的控件绑定到一个 ViewModel,它公开了绑定到 TabControl 的页面集合。每个页面都公开了一组绑定到Grid 的行。
我尝试遵循this one from SO 和this one from C-SharpCorner 之类的模式。我没有嫁给这些,所以如果有更好的模式(as this post seems to indicate),我愿意朝另一个方向发展。
目前,我不确定在哪里注入PropertyGroupDescription 的定义并将其绑定到我想要的PropertyName。我尝试将其作为资源并直接作为DataGrid 上的CollectionViewSource。但两者都没有产生合理的结果。
这是我目前所拥有的:
<UserControl x:Class="View.ViewInvoiceUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" >
<Grid Name="_grid" MinHeight="100">
为清晰起见截取...
<TabControl
ItemsSource="{Binding Path=CurrentInvoice.InvoicePages}"
Grid.Column="0"
Grid.ColumnSpan="4"
Grid.Row="5"
HorizontalAlignment="Left"
Margin="0,4,0,0"
Name="_invoicePageTabControl"
VerticalAlignment="Top">
<TabControl.ItemContainerStyle />
<TabControl.ContentTemplate>
<DataTemplate>
<DataGrid
Name="_invoiceLineGrid"
AutoGenerateColumns="False"
CanUserSortColumns="True"
ColumnHeaderStyle="{StaticResource columnHeaderStyle}"
HorizontalAlignment="Left"
ItemsSource="{Binding InvoiceLines}"
IsReadOnly="True"
RowDetailsVisibilityMode="VisibleWhenSelected"
RowStyle="{StaticResource DataGridRowStyle}"
SelectionUnit="FullRow"
VerticalAlignment="Top"
Visibility="{Binding Path=InvoiceLineGridVisibility}"
Initialized="_invoiceLineGrid_Initialized">
<DataGrid.Columns>
<DataGridTextColumn Header="Line Number" MinWidth="50" Binding="{Binding InvoiceLineNumber}" />
<DataGridTextColumn Header="Description" MinWidth="50" Width="*" Binding="{Binding Description}" />
<DataGridTextColumn Header="Quantity" MinWidth="50" Binding="{Binding Quantity}" />
<DataGridTextColumn Header="Extended Cost" MinWidth="50" Width="*" Binding="{Binding ExtendedCost}" />
</DataGrid.Columns>
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander>
<Expander.Header>
<StackPanel>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
</Grid>
</UserControl>
我想我需要添加如下内容:
<CollectionViewSource>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="DepartmentBillingCode" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
如果我将CollectionViewSource 添加为资源并更改DataGrid 绑定,则网格中没有行。
如果我将CollectionViewSource 添加到DataGrid,我会得到一个异常:Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead. 嵌套在Add value to collection of type 'System.Windows.Controls.ItemCollection' threw an exception.
但我在DataGrid.ItemSource 上看不到GroupDescription 或PropertyGroupDescription
所以,我现在感觉很迷茫。 任何建议表示赞赏。
谢谢
【问题讨论】:
-
@Георгий Ланец,感谢您的编辑。很高兴看到老问题得到关注。
-
保罗,欢迎您。我喜欢使代码完美。这就是为什么我总是选择截止日期。
标签: wpf datagrid binding grouping