我需要对DataGrid
中嵌套在TabControl
中的行应用分组。 DataGrid
和TabControl
都是数据绑定。最外层控件绑定到ViewModel,该ViewModel公开绑定到TabControl
的页面集合。每个页面都显示绑定到Grid
的行集合。
我尝试遵循this one from SO和this one from C-SharpCorner等模式。我没有和这些结婚,所以如果有更好的模式(as this post seems to indicate),我愿意朝另一个方向前进。
目前,我不知道在哪里注入PropertyGroupDescription
的定义并将其绑定到我想要的PropertyName
。我已尝试将其作为资源并直接作为CollectionViewSource
上的DataGrid
。但两者都没有产生合理的结果。
这是我到目前为止所做的:
<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.
中
但我在GroupDescription
PropertyGroupDescription
或DataGrid.ItemSource
所以,我现在感到迷茫。 任何建议都表示赞赏。
由于
答案 0 :(得分:1)
所以我找到了一个可能的答案。我对其他人的解释持开放态度。这是一个很好的解决方案吗?
应用SO post regarding what part of MVVM pattern is resonsible for grouping of DataGrid,我开始寻找解决方案以在ViewModel中生成分组。我在WpfTutorial.com
上找到了一个简单的例子在我的InvoicePageViewModel中,我创建了一个新属性,用于从List中创建ListViewCollection。 ListViewCollection允许我添加我自己的GroupDescription,如下所示:
public ListCollectionView GroupedInvoiceLines
{
get
{
ListCollectionView groupedLines = new ListCollectionView(InvoiceLines); // TODO should this be cached?
groupedLines.GroupDescriptions.Add(new PropertyGroupDescription("DepartmentBillingCode"));
return groupedLines;
}
}
然后将DataGrid上的数据绑定从InvoiceLines更改为GroupedInvoiceLines是微不足道的。
评论?有问题吗?